使用java

时间:2018-03-08 06:36:50

标签: linux bash shell ppp sshpass

计算机A使用sshpass连接到远程计算机B,并且远程计算机B没有直接ssh root user访问权限,因此我通过sudo连接到user并使用sudo suls -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会话。

3 个答案:

答案 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。您可以在下面的屏幕截图中看到执行

Execution

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

使用sudo

正如您在下图所示,它甚至适用于sudo。但是建议一下,你不应该使用sudo su,因为这需要一个用户shell,并且你希望在你传递给SSH的命令中使用sudo -u <user>

SSH working

编辑: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

$