多路复用器

多路复用器

我尝试ssh通过另一个进程来操纵进程。我运行的图像ssh root@XXXX和 pid 是 12345。我想运行一个程序来告诉 ssh 会话运行ls命令,我尝试过echo ls > /proc/12345/fd/0。 ssh 终端正确显示回显,但是在我按下 后enter,远程计算机似乎没有收到ls命令。

有什么可以做我想做的事吗?

更具体地说,我尝试登录的服务器使用动态密码,既不是公共密码,也不是标准 ssh 身份验证方法的密码。服务器提示输入otp并进行身份验证

答案1

我想到了四种方法:

  • 多路复用器
  • SSH
  • 预计
  • 其他方法

多路复用器

使用tmux,您可以将字符串或按键发送到ssh可能正在运行/可以设置为运行的窗格:

tmux new -d -s mySession
tmux send-keys -t mySession.0 "ssh root@XXXX" ENTER
tmux send-keys -t mySession.0 "ls" ENTER

您的里程可能会有所不同,具体取决于连接所需的次数或是否需要使用密码/密钥,但这在这里可能是显而易见的。

SSH

这个可能不是那么明显,但是大致有两种方法可以直接通过 ssh 运行命令:

  • 直接使用shell命令
ssh remote "command here"

或者

ssh -t remote "command here"
  • 将 Heredoc 与 ssh 结合使用
ssh remote << 'EOF' # can use any other marker pair/string as explained below
command
list
here
EOF

这给了你更多的自由来运行什么,并且在这里处理报价也不再那么麻烦。

一个问题是,在[此处的文本编辑器]中制作定界符时,您需要使用语法突出显示,以便您可以查看标记是否heredoc正确关闭,特别是如果所述标记出现在您在定界符中使用的任何字符串中...(或者只是使用更长的定界标记,也可以)

您可以根据自己的需要使用这两种方法,但请记住:

  • 它将在远程计算机上为每个 ssh 进程生成一个 PID,因此,如果您想连续运行多个命令并决定将它们分隔在不同的行或heredoc中,那么您将在某个时刻用完 PID(如果这是受限制的虚拟机/机器,或者如果您的远程资源不足)。

  • 只要确保关闭它们/只留下一个,这样您仍然可以根据需要保持 ssh 连接。

  • 这些解决方案中的任何一个都可能会抱怨TERM未设置变量,只需这样设置:

export TERM=xterm

预计

您可以使用expect,正如其他答案提到的:

#!/usr/bin/expect -f
spawn ssh remote.server.com
expect "password: "
send "passwordhere?\r"
expect "$ "
......       ##Various automated commands##
expect "$ "
send "exit\r"

您的里程会有所不同多很多在这里,给出的expect是一种 或者 错过,尤其是在与密码提示交互时......

其他方法

您可以使用其他方法,例如:

  • sendkeys存储库,或/和xdotool从本地存储库可以将密钥/字符串发送到特定窗口,可以将其设置为正在运行的终端ssh或您可以选择的任何内容。以下是两者的(示例)语法。
sendkey.sh "Yourwindowname" "yourstringorkey"

或/和

xdotool type --window "window ID here" "your string here"

笔记:

有时,xdotool和/或sendkey可能在不同的窗口/程序上工作或不工作,但两者都应该在大多数终端上工作。

如果其中一种不起作用,请尝试另一种。此外,wmctrl可能还应该安装它来获取您所定位的窗口的 id/pid/info,除非您更喜欢用于xprop此目的...(大多数发行版上已经安装了它)。

最后,您可以选择其中之一:

  • evdev(感谢@Forest提到这一点)
  • pyinput
  • pyautogui

这三个主要用作 python 库,但也移植到其他语言...如果我要在这里介绍这个问题,这将使这个答案太长,所以我会让其他人在他们自己的答案中这样做。

答案2

不。按照设计,进程在 Unix/Linux 上不是这样工作的。

如果我明白你想要什么,这个expect程序可能会有所帮助。读man expect

相关内容