计算机A使用sshpass
连接到远程计算机B,并且远程计算机B没有直接ssh
root
user
访问权限,因此我通过sudo
连接到user
并使用sudo su
,ls -lrt /some/dir
sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@192.168.0.3 "sudo ls /dev/ttyUSB*"
时我也禁用了密码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"
。当命令很简单,如/* Creating a UNIX datagram socket for Server Application */
if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
{
perror("server: socket");
exit(1);
}
时,我得到了命令的正确输出,但是当我在远程机器上启动服务器/ shell脚本时(服务器在脚本运行1分钟时没有时间),输出显示但是bash没有恢复正常(即看起来它正在做一些工作,但我知道服务器已经启动/脚本已经完成)。
使用的命令:
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没有返回,所以我不能进一步编写命令。
我无法共享脚本或服务器程序,因为它是公司的代码。但服务器代码使用UNIX数据报套接字进行通信。
sshpass
编辑1:
当我尝试
时func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool
{
let identifiers = [kUTTypeURL as String]
return session.hasItemsConforming(toTypeIdentifiers: identifiers) && session.items.count == 1
}
服务器程序正确启动但脚本没有按预期工作并且没有返回bash但是只要我按下Sub index()
Dim var As Variant
Dim var1 As Variant
Set var = Application.WorksheetFunction.index(Worksheets("Stocks").Range("D:E"), Application.WorksheetFunction.Match(Worksheets("Invoice").Range("B12").Value, Worksheets("Stocks").Range("B:B"), 0), 2)
var1 = Worksheets("Invoice").Range("C12").Value
var.Value = var - var1
End Sub
bash返回,我知道这意味着什么但不知道是什么
编辑2:
我无法将输出重定向到文件,因为我不知道该命令需要多长时间才能运行,可能需要一分钟或几分钟。
编辑3:
我找到了一些有用的东西(我猜)。保留在该计算机B上的脚本在后台创建了几个进程,因此HttpWebRequest
不会返回,直到所有这些后台进程都从机器B手动终止。一旦这些程序被终止,我们将输出作为以及重击。
编辑4:
该脚本创建在后台运行的8个ppp会话。
答案 0 :(得分: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");
答案 1 :(得分:3)
如果希望ssh执行命令并在命令完成之前返回,请使用-f
选项,例如ssh -f user@host myServer
。如果它可能产生输出,您可能想要重定向stdout和/或stderr。
有关详细信息,请参见手册页:https://man.openbsd.org/ssh#f
答案 2 :(得分: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脚本,而不是该脚本可以将各个脚本记录到各自的文件或主stdout上的spit输出,并在命令中使用的/tmp/log
中捕获
使用sudo
正如您在下图所示,它甚至适用于sudo。但是建议一下,你不应该使用sudo su
,因为这需要一个用户shell,并且你希望在你传递给SSH的命令中使用sudo -u <user>
编辑:19-Mar-18
根据您的编辑,您提供了一个脚本
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
$