关于ZAKER 融媒体解决方案 合作 加入

当使用 Python Paramiko exec_command 执行时 , 某些 Un.

CocoaChina 09-16

我试图在 Paramiko exec_command 的帮助下从Python在 Unix 服务器上运行 sesu 命令 . 但是当我运行这个命令 exec_command ( ‘ sesu test ’ ) 时 , 我得到了

sh: sesu: not found

当我运行简单的 ls 命令时 , 它给我所需的输出 . 只有使用 sesu 命令它才能正常工作 .

这是我的代码的样子:

import paramikohost = hostusername = usernamepassword = passwordport = portssh=paramiko.SSHClient ( ) ssh.set_missing_host_key_policy ( paramiko.AutoAddPolicy ( ) ) ssh.connect ( ip,port,username,password ) stdin,stdout,stderr=ssh.exec_command ( 'sesu test' ) stdin.write ( 'Password' ) stdin.flush ( ) outlines=stdout.readlines ( ) resp=''.join ( outlines ) print ( resp )

最佳答案

默认情况下 ,SSHClient.exec_command 不以 " 登录 " 模式运行 shell, 也不为会话分配伪终端 . 因此 , ( 在一些交互式 SSH 会话中 ) 可能 ( 可能 ) 获取不同的启动脚本集 ( 特别是对于非交互式会话 ,.bash_profile 不是源 ) . 和 / 或脚本中的不同分支基于 TERM 环境变量的缺失 / 存在而被采用 .

可能的解决方案 ( 按优先顺序 ) :

> 修复命令不依赖于特定环境 . 在命令中使用完整路径 sesu. 例如 .:

/bin/sesu test

如果您不知道完整路径 , 则在常见的 * nix 系统上 , 您可以在交互式 SSH 会话中使用哪个 sesu 命令 .

> 修复启动脚本 , 为交互式和非交互式会话设置相同的 PATH.

> 尝试通过登录 shell 显式运行脚本 ( 使用带有常见 * nix shell 的– login 开关 ) :

bash --login -c "sesu test"

> 如果命令本身依赖于特定的环境设置而无法修复启动脚本 , 则可以在命令本身中更改环境 . 该语法取决于远程系统和 / 或 shell. 在常见的 * nix 系统中 , 这有效:

PATH="$PATH;/path/to/sesu" && sesu test

> 另一种 ( 不推荐 ) 方法是使用 get_pty 参数强制 "exec" 通道的伪终端分配:

stdin,stdout,stderr=ssh.exec_command ( 'sesu test', get_pty=True )

使用伪终端自动执行命令可能会带来令人讨厌的副作用 . 参见例如Is there a simple way to get rid of junk values that come when you SSH using Python ’ s Paramiko library and fetch output from CLI of a remote machine?

也可以看看:

> Environment variable differences when using Paramiko

> Certain Unix commands fail with " … not found", when executed through Java using JSch

以上内容由"CocoaChina"上传发布 查看原文
相关标签 pythonunix

觉得文章不错,微信扫描分享好友

扫码分享