获取ssh来在目标机器上的后台执行命令获取ssh来在目标机器上的后台执行命令(Getting ssh

2019-05-10 11:41发布

这是一个后续的问题给你如何在shell脚本中使用ssh? 题。 如果我想在该机器上的后台运行在远程机器上执行命令我如何才能ssh命令返回? 当我尝试只是包括符号(&)在它只是挂起的命令结束。 该命令的具体形式如下:

ssh user@target "cd /some/directory; program-to-execute &"

有任何想法吗? 有一点要注意的是,登录到目标机器总是产生一个文本标语,我有SSH密钥设置,因此无需密码。

Answer 1:

我曾在一个节目我写了一年前的这个问题 - 原来的答案是相当复杂的。 你需要使用的nohup以及输出重定向,如在维基百科artcle解释的nohup ,复制在这里为您提供方便。

Nohuping背景执行作业是例如通过SSH登录时,由于背景执行作业可以使外壳挂在注销有用由于竞态条件[2]。 这个问题也可以通过重定向所有三个I / O流克服:

 nohup myprogram > foo.out 2> foo.err < /dev/null & 


Answer 2:

这一直为我做的最彻底的方法: -

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

在此之后运行的唯一的事情是在远程机器上的实际命令



Answer 3:

重定向FD的

输出需要与被重定向&>/dev/null被重定向既stderr和标准输出到/ dev / null,并且是的同义词>/dev/null 2>/dev/null>/dev/null 2>&1

括号

最好的办法是使用sh -c '( ( command ) & )' ,其中的命令是什么。

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

NOHUP壳牌

您还可以使用nohup的直接启动外壳:

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

尼斯启动

另一个技巧就是用漂亮来启动命令/壳:

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'


Answer 4:

我只是想表明一个工作的例子,你可以剪切和粘贴:

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""


Answer 5:

如果不这样做/不能保持连接打开,您可以使用屏幕上 ,如果你有安装它的权利。

user@localhost $ screen -t remote-command
user@localhost $ ssh user@target # now inside of a screen session
user@remotehost $ cd /some/directory; program-to-execute &

要取下屏幕会话:CTRL-A d

要列出屏幕会话:

screen -ls

要重新会话:

screen -d -r remote-command

请注意,屏幕也可以在各个会话中创建多个壳。 类似的效果可达到TMUX 。

user@localhost $ tmux
user@localhost $ ssh user@target # now inside of a tmux session
user@remotehost $ cd /some/directory; program-to-execute &

要取下TMUX会话:CTRL-B d

要列出屏幕会话:

tmux list-sessions

要重新会话:

tmux attach <session number>

默认TMUX控制键,“CTRL-B”,实在有些难用,但也有与TMUX,你可以尝试一些出货例如TMUX CONFIGS。



Answer 6:

最快,最简单的方法是使用“在”命令:

SSH用户@目标“在现在-f /home/foo.sh”



Answer 7:

我想你会拥有一对夫妇这些答案的结合起来,得到你想要的。 如果你在分号结合使用nohup的,并用引号括整个事情,那么你得到:

ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"

这似乎为我工作。 随着nohup的,你不需要追加与所要运行的命令。 另外,如果你不需要读取任何命令的输出,你可以使用

ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"

重定向所有输出到/ dev / null的。



Answer 8:

这个工作对我来说可能时间:

ssh -x remoteServer "cd yourRemoteDir; ./yourRemoteScript.sh </dev/null >/dev/null 2>&1 & " 


Answer 9:

事实上,每当我需要到远程机器的复杂运行的命令,我喜欢把命令在目标机器上的脚本,只是使用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"


Answer 10:

我试图做同样的事情,但有一个额外的复杂性,我试图从Java做。 因此,在一台机器上运行Java,我试图在另一台机器上运行一个脚本,在后台(带的nohup)。

在命令行中,这里是什么工作:(你可能不需要“-i密钥文件”,如果你不需要它ssh到主机)

ssh -i keyFile user@host bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""

需要注意的是我的命令行,还有之后的“-c”,这是所有在引号一个参数。 但为了能在另一端的工作,它仍然需要引号,所以我不得不把它内转义引号。

从Java,这里是什么工作:

ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
 "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.

它采取了一些尝试错误得到这个工作,但现在看来效果不错。



Answer 11:

你可以做这样的...

sudo /home/script.sh -opt1 > /tmp/script.out &


Answer 12:

我想这是你所需要的:首先,您需要安装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


Answer 13:

首先遵循以下步骤:

登录在A作为用户,并生成一个认证密钥对。 不要输入密码:

a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa): 
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A

现在使用ssh创建一个目录的〜/ .ssh作为B.(目录可能已经存在,这是很好的)用户B:

a@A:~> ssh b@B mkdir -p .ssh
b@B's password: 

最后追加的新的公共密钥到B @ B:的.ssh / authorized_keys文件,并输入B的密码最后一次:

a@A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
b@B's password: 

从现在起,你可以为B从A作为登录到B,不含密码:

a@A:~> ssh b@B

那么这将工作不输入密码

SSH b @ B“CD /一些/目录;程序到执行与”



文章来源: Getting ssh to execute a command in the background on target machine
标签: bash ssh csh