【问题标题】:Remote shell scripting远程 shell 脚本
【发布时间】:2013-07-09 18:13:03
【问题描述】:

我想编写一个脚本,我可以用它来 grep 远程服务器上的进程, 在每台服务器上已经有一个用户帐户可以在没有密码的情况下进行 ssh, 所以这个想法是这个脚本会

  • sudo 到无密码用户帐户
  • ssh 到远程服务器
  • 运行命令(ps -ef | grep 进程名)
  • 在本地服务器上显示输出
  • 关闭 ssh 连接
  • 退出无密码用户帐户

在我有的那一刻:

if [ $1 = -r ]
then
su - useraccount
ssh $2 "ps -ef | grep process | grep -v grep"
exit
else
ps -ef | grep process | grep -v grep
fi

这里的想法是如果你没有 -r 选项,你可以在本地运行脚本 所以要在本地运行,您将拥有

script.sh processname

或远程

script.sh -r remotehost processname

我有 grep -v grep 因为它只是让我在列表中看到我自己的 grep 命令很烦,
我只是觉得它看起来有点干净
有什么想法吗?

【问题讨论】:

  • 那么问题出在哪里?
  • su 启动自己的shell,使用su - username -c "your ssh command"
  • 谢谢,是的,我可以让脚本 ssh 到远程服务器上,但现在问题是将本地变量传递给远程服务器,所以如果我运行 script.sh -r remotehost processname 本地进程名是 $3但不是远程

标签: shell scripting ssh remote-access


【解决方案1】:

您不必在本地切换到其他用户即可在远程系统上以该用户身份登录。

ssh -l <username> remotemachine 

所以:

ssh -l useraccount remote host ps -ef | grep process

在本地执行 grep,您也可以避免 grep 出现在输出中的问题。

【讨论】:

    【解决方案2】:

    如果您有很多处理和管道要做,我建议您在本地主机上编写一个脚本,然后使用 ssh 在远程主机上调用它。

    localhost $cat localScript.sh #!/usr/bin/ksh`

    ps -ef | grep -i java | grep -v grep

    本地主机 $ssh remotePassword@remotehostname &lt; localScript.sh

    这将在本地主机上打印预期的输出。

    【讨论】:

      【解决方案3】:

      而不是说

      ssh -t host command $argument ...
      

      ARGUMENT="-abc"
      COMMAND="'command $ARGUMENT'"
      

      然后提供

      sst -t host $COMMAND
      

      远程机器不知道$ARGUMENT 是什么,所以一定要在发送之前在本地机器上插入该字符串。请注意,您需要像上面一样使用引号,因为您不能在单个刻度内插入变量 ('')。

      编辑:

      我想知道你为什么坚持在远程机器上运行管道。你能不能简单地说:

      ssh -t host -- ps -ef | grep process_name | grep -v grep
      

      在我看来,这是最好的方法。这样你就不必纠结于变量插值和好奇的滴答声了。

      编辑 2:

      你不能只使用sudo -s username ssh foo吗?

      【讨论】: