0

我想写一个脚本,我可以用它来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 命令让我烦恼,
我只是觉得它看起来更干净有
什么想法吗?

4

3 回答 3

1

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

本地主机 $ cat localScript.sh #!/usr/bin/ksh`

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

本地主机 $ssh remotePassword@remotehostname < localScript.sh

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

于 2015-05-13T10:57:10.397 回答
0

而不是说

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吗?

于 2013-10-23T01:45:20.963 回答
0

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

ssh -l <username> remotemachine 

所以:

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

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

于 2015-05-13T11:02:50.867 回答