执行像 ssh、scp 这类 secure command 时,必须手工输入密码,而且它们是直接从 /dev/tty 而不是 stdin 中读取密码的,这也意味着无法通过重定向 IO 的方式传送密码給这些程序,查了一下网上一般的解决方案是借助 paramiko 或 pexpect 这两个第三方库来解决的。
但安装第三方库对于不能随意访问互联网的环境来说是很麻烦的一件事情。
其实就这个应用场景来说,完全没必要用到第三方库,python 自带一个名为 pty 的 modual,它有一个 spawn 函数,manual 中对它的描述是:
pty.spawn(argv[, master_read[, stdin_read]])
Spawn a process, and connect its controlling terminal with the current process’s standard io. This is often used to baffle programs which insist on reading from the controlling terminal.
这就好办了,我们只要创建一个名为 pty-process.py 脚本,在这个脚本中用 pty.spawn 调用 secure command,然后再通过写入该脚本 stdin 的方式就可以变相地給这些 secure command 发送密码了。
pty-process.py 脚本的实现如下:
#!/bin/env python3
import pty
import sys
pty.spawn(sys.argv[1:])
借助于这个 pty-process.py 我们可以这样执行 secure command 了
echo $passwd |pty-process.py ssh $usr@$remote $command
