【发布时间】:2018-08-16 10:30:14
【问题描述】:
机器 A 使用 sshpass 连接到远程机器 B,而远程机器 B 没有直接让 ssh 访问 root,所以我通过 user 连接到它并使用 sudo,我也当他执行sudo su 时,已禁用user 的密码。当命令像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,但是当我按下 ENTER 时,bash 返回,我知道这意味着什么,但不知道是什么。
编辑 2:
我无法将输出重定向到文件,因为我不知道该命令总共需要多少时间才能运行,可能需要一分钟或几分钟。
编辑 3:
我发现了一些很有帮助的东西(我猜)。保留在该机器 B 上的脚本在后台创建了几个进程,因此 sshpass 不会返回,直到所有这些后台进程从机器 B 手动终止。一旦这些程序被终止,我们就会得到该输出以及猛击回来。
编辑 4:
脚本创建 8 个在后台运行的 ppp 会话。
【问题讨论】:
-
尝试致电
process.getOutputStream().close()看看是否有效果。 -
我不知道需要多长时间,所以我无法关闭输出流,但 sshpass 命令在这里出错,而不是 java。请帮我解决这个问题或其他方法。
-
关闭输出流不会停止进程。该进程获得 EOF。
-
那么我应该什么时候关闭输出流? @KDM
-
你可以把它放在 exec() 调用之后。由于 Control+C 似乎使您的应用程序工作 - 看起来应用程序正在等待一些输入。发送 EOF 可能会解决问题。
标签: linux bash shell ppp sshpass