Plink冻结后sudo su - 命令

时间:2018-05-03 14:08:11

标签: plink

我正在尝试使用plink.exe从windows机器远程发出一些命令到Linux机器,并且它成功执行除 sudo su -

之外的所有命令

实际上,它也会执行sudo su - 我可以看到我现在是超级用户的输出,但此时它会冻结,因此不能执行任何其他命令。

这是我到目前为止所使用的:

{
   labels: ['Here', 'are', 'your', 'x-axis', 'labels'],
   datasets: [
     {
       label: 'artist 1',
       backgroundColor: 'rgba(75, 192, 192, 0.2)',
       data: [0, 1, 2, 3, 4],
     },
      {
       label: 'artist 2',
       backgroundColor: 'rgba(255, 99, 132, 0.2)',
       data: [0, 1, 2, 3, 4],
     },
   ],
 }

我还尝试将sudo su命令发送到后台,如下所示:

./plink.exe -ssh -v -pw myPassHere myUser@myHost "hostname;ls -la;sudo su - ; touch test.me"

这将执行上述命令,包括 sudo su ,但会添加:

 ./plink.exe -ssh -v -pw myPassHere myUser@myHost "hostname;ls -la; sudo su - & touch test.me"

并关闭连接 - 仍然没有执行最后的触摸命令

还尝试添加&和;像这样:

logout root
stty: Not a typewriter
stty: Not a typewriter
stty: Not a typewriter

这给了我:

./plink.exe -ssh -v -pw myPassHere myUser@myHost "hostname;ls -la;sudo su -&;touch test.me"

我非常确定在发出sudo su - 命令后,提示符需要一个结果,这就是为什么它冻结但不知道如何暂停一段时间以允许sudo su - 命令执行或如何避免shell期望输出。

2 个答案:

答案 0 :(得分:2)

在非交互式上下文中不应该需要sudo su -(这种非交互性导致“stty:Not a typewriter”错误)。

只需使用sudo touch test.me

答案 1 :(得分:0)

此方法基于通过命令提示符执行。 首先,确保将Putty和Plink添加到您的环境变量中。 然后,尝试此代码

try
                {
    // To connect using putty/plink
                String initialConnect = "cmd /c PLINK.exe -batch -i \"<path_to_keytab>\" <username>@<hostname>";
                //Eg.: String initialConnect = "cmd /c PLINK.exe -batch -i \"C:\\Users\\vsakaray\\Downloads\\private_key.ppk\" myuser@10.42.81.9";
                Process p = Runtime.getRuntime().exec(initialConnect);
                /* Get OuputStream */
                PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
                /* Storing list of commands to execute */
                String commands[] = { "sudo su user", "cd ~", "pwd" };
                /* Executing commands */
                for (String command : commands)
                {
                    writer.println(command.trim());
                }
                Thread.sleep(5000);
                int value = 0;
                InputStream std = p.getInputStream();
                /* Printing the console output */
                if (std.available() > 0)
                {
                    System.out.println("STD:");
                    value = std.read();
                    System.out.print((char) value);
                    while (std.available() > 0)
                    {
                        value = std.read();
                        System.out.print((char) value);
                    }
                }
                System.out.print("DONE!!!");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }