我尝试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
。