4

机器 A 使用连接到远程机器 Bsshpass并且远程机器 B 不能直接ssh访问,root所以我通过它连接到它user并使用sudo,并且我还禁用了user他何时使用的密码sudo su。当命令很简单时,例如ls -lrt /some/dir我得到了正确的命令输出,但是当我在远程机器上启动服务器/shell 脚本时(服务器不需要时间,而脚本需要 1 分钟运行),会显示输出但 bash 不返回恢复正常(即看起来它正在做一些工作,但我知道服务器已经启动/脚本已经完成)。

使用的命令:

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@192.168.0.3 "sudo ls /dev/ttyUSB*"

以上工作正常,我得到输出并返回 bash,这样我就可以编写更多命令并做一些事情。

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@192.168.0.3 "sudo /root/path/server &"

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@192.168.0.3 "sudo /root/path/to/script/scriptTakes1Minute param1 param2"

但是,上述操作并没有按预期工作。看起来它正在工作,但不是没有返回 bash,所以我无法进一步编写命令。

我不能共享脚本或服务器程序,因为它是公司的代码。但是服务器代码使用 UNIX 数据报套接字进行通信。

/* Creating a UNIX datagram socket for Server Application */
        if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
        {
                perror("server: socket");
                exit(1);
        }

编辑1:

当我尝试

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@192.168.0.3 "sudo /root/path/server >/dev/null &2>1 </dev/null &"

服务器程序正确启动,但脚本没有按预期工作并且没有返回 bash,但是当我按下ENTERbash 返回时,我知道这意味着什么,但不知道是什么。

编辑2:

我无法将输出重定向到文件,因为我不知道命令总共需要多少时间才能运行,它可能需要一分钟或几分钟。

编辑 3:

我发现了一些很有帮助的东西(我猜)。保留在该机器 B 上的脚本在后台创建了几个进程,因此sshpass直到所有这些后台进程从机器 B 手动终止后才会返回。一旦这些程序被终止,我们就会得到该输出以及 bash 返回.

编辑4:

该脚本创建 8 个在后台运行的 ppp 会话。

4

3 回答 3

4

只需再使用一行代码即可process.waitFor();解决您的问题:-

 process = Runtime.getRuntime().exec(SHELL_COMMAND);
 process.waitFor();// add this line to complete execution of your shell command
 System.out.println("LLLLLLLOOOOOOOOOKKKKKKKK started process");
于 2018-03-08T07:55:58.373 回答
3

如果您希望 ssh 执行命令并在命令完成之前返回,请使用-f选项,例如ssh -f user@host myServer. 如果它可能产生输出,您可能希望重定向 stdout 和/或 stderr。

有关详细信息,请参见手册页:https ://man.openbsd.org/ssh#f

于 2018-03-12T23:47:14.890 回答
2

所以我使用 express 创建了一个简单的服务器

express = require('express');

app = express();

app.all('/', (req, res) => {
   res.send('anc\n');
})

app.listen(9099, () => {
   console.log('server started');
});

然后使用执行

sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@192.168.33.100 "node /tmp/server/index.js 1>/tmp/log 2>&1"

它将输出记录到/tmp/log. 您可以在下面的屏幕截图中看到执行

执行

如您所见,我也可以捕获日志。如果您有要运行的命令列表,那么我将使用 shell 脚本,而该脚本可以将单个脚本记录到它们各自的文件中或在主标准输出上吐出输出,并在/tmp/log我们在命令中使用的命令中捕获

使用 sudo

正如您在下图中看到的那样,它甚至可以与 sudo 一起使用。但是建议您不要使用sudo su,因为这需要用户 shell,并且您希望sudo -u <user>在传递给 SSH 的命令中使用

SSH 工作

编辑:2018 年 3 月 19 日

根据您的编辑,您提供了一个脚本

echo "First Line" 
ping 10.100.208.102 >/dev/null & 
echo "Last Line"

现在我假设您也想要输出Last Line,然后您也不想挂起终端。下面的测试命令对我有用

$ sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@192.168.33.100 "sudo sh /tmp/server/ping.sh 1>/tmp/log 2>&1 && cat /tmp/log"
First Line
Last Line

$
于 2018-03-13T08:33:59.410 回答