这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
当前回答
fd的重定向
输出需要用&>/dev/null重定向,它将stderr和stdout重定向到/dev/null,是>/dev/null 2>/dev/null或>/dev/null 2>&1的同义词。
偏执狂
最好的方法是使用sh -c '((command) &)',其中command是任何东西。
ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
Nohup壳
你也可以使用nohup直接启动shell:
ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
漂亮的发射
另一个技巧是使用nice来启动命令/shell:
ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'
其他回答
你可以这样做……
sudo /home/script.sh -opt1 > /tmp/script.out &
没有nohup你也可以做到:
ssh user@host 'myprogram >out.log 2>err.log &'
对我来说,使用tmux new -d <shell cmd>语法进行远程tmux会话似乎非常方便:
ssh someone@elsewhere 'tmux new -d sleep 600'
这将在其他主机上启动新会话,本地机器上的ssh命令将几乎立即返回shell。然后您可以通过ssh连接到远程主机,并将tmux附加到该会话。注意,没有本地tmux运行,只有远程运行!
另外,如果你想让你的会话在任务完成后继续,只需在命令后添加一个shell启动器,但不要忘记用引号括起来:
ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'
实际上,每当我需要在远程机器上运行复杂的命令时,我喜欢将命令放在目标机器上的脚本中,然后使用ssh运行该脚本。
例如:
# simple_script.sh (located on remote server)
#!/bin/bash
cat /var/log/messages | grep <some value> | awk -F " " '{print $8}'
然后我在源机器上运行这个命令:
ssh user@ip "/path/to/simple_script.sh"
我认为这是你需要的: 首先,您需要在您的机器上安装sshpass。 然后你可以编写自己的脚本:
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE