![可以通过 ssh 使用 su 通过管道传输命令](https://linux22.com/image/69529/%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%20ssh%20%E4%BD%BF%E7%94%A8%20su%20%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%91%BD%E4%BB%A4.png)
我正在尝试编写一个 python 脚本来远程更新我管理的一组帐户的登录密码 - 我已经可以成功使用 python 通过 ssh 进程的 stdin 传输远程命令。不过我想测试一下远程密码是否设置正确。我可以这样做我可以远程这样做如下:
[localhost]% ssh -t -o RequestTTY=true user@host
[host]% su user -c true
并根据提示提供密码。这可行,但如果我远程尝试以下操作:
[localhost]% echo "su user -c true" | ssh -t -o RequestTTY=true user@host
我得到:
su: must be run from a terminal
请注意,这并不是失败,因为 su 需要一个密码(我最终将通过 python 提供) - 它在此之前失败。 su 不喜欢以这种方式通过管道运行。
发生了什么事,如何将输入传送到远程 su 命令? (或远程测试某些用户的密码是否正确)。
答案1
将密码通过管道传送到su
,而 又通过管道传送到ssh
。
下面的例子。请注意 foopass 是用户 foo 的正确密码,因此它会id
愉快地运行该命令。请注意 badpass 是用户 foo 的错误密码,因此会生成身份验证失败。
$ echo "echo foopass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: uid=1001(foo) gid=1003(foo) groups=1003(foo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ echo "echo badpass | su foo -c id" | ssh -t -o RequestTTY=yes steve@localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
Password: su: Authentication failure
$