我有一个 20 多个服务器的列表,我想获取他们正在使用的 shell。登录到服务器后,我可以运行以下命令
$ ps -p $$
PID TTY TIME CMD
12022 pts/6 00:00:00 bash
我尝试用列表循环它,而不是接触每个服务器并执行此操作
$ for i in `cat servlist`; do echo $i ; ssh $i ps -p $$ ; done
serv1
PID TTY TIME CMD
serv2
PID TTY TIME CMD
serv3
PID TTY TIME CMD
循环此操作不会显示预期的输出。然后我尝试 ssh 到单个服务器并运行命令,但出现了相同的错误。
$ ssh serv4 ps -p $$
PID TTY TIME CMD
为什么会发生这种情况,ssh 手册页中没有任何内容让我想到。
答案1
那是因为该进程不存在。
正在$$
本地评估,并且所有服务器都传递相同的数字。不是服务器上当前使用的 PID 的数字。
所有的$
事情都是由 shell 完成的,而不是命令。您需要转义它,以便服务器上的 shell 对其进行评估。
尝试\$\$
例如
for i in $(cat servlist); do echo $i; ssh $i 'ps -p $$'; done
未经测试的