python - 一些 Unix 命令失败并显示“ 未找到”,当使用 Python Paramiko exec_command 执行时
问题描述
我正在尝试sesu
在 Paramiko 的帮助下从 Python 在 Unix 服务器中运行命令exec_command
。但是,当我运行此命令时exec_command('sesu test')
,我得到
sh: sesu: 未找到
当我运行简单的ls
命令时,它会给我想要的输出。只有使用sesu
命令它不能正常工作。
这就是我的代码的样子:
import paramiko
host = host
username = username
password = password
port = port
ssh=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,也不为会话分配伪终端。.bash_profile
因此,与常规交互式 SSH 会话(特别是非交互式会话,没有源)相比,(可能)获取了一组不同的启动脚本。和/或脚本中的不同分支基于TERM
环境变量的缺失/存在而被采用。
可能的解决方案(按优先顺序):
修复命令不依赖于特定环境。
sesu
在命令中使用完整路径。例如:/bin/sesu test
如果您不知道完整路径,在常见的 *nix 系统上,您可以
which sesu
在交互式 SSH 会话中使用命令。修复您的启动脚本,
PATH
为交互式和非交互式会话设置相同的设置。尝试通过登录 shell 显式运行脚本(使用
--login
带有常见 *nix shell 的 switch):bash --login -c "sesu test"
如果命令本身依赖于特定的环境设置并且您无法修复启动脚本,您可以在命令本身中更改环境。其语法取决于远程系统和/或 shell。在常见的 *nix 系统中,这是有效的:
PATH="$PATH;/path/to/sesu" && sesu test
另一种(不推荐)方法是使用参数强制为“exec”通道分配伪终端
get_pty
:stdin,stdout,stderr = ssh.exec_command('sesu test', get_pty=True)
使用伪终端自动执行命令会给您带来讨厌的副作用。例如,请参阅是否有一种简单的方法来摆脱使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时出现的垃圾值?
LD_LIBRARY_PATH
您在查找共享对象时可能会遇到类似的问题。
也可以看看:
推荐阅读
- java - 为什么我在 System.setProperty(“webdriver.chrome.driver”, “C:\\Users\\cchadwell\\Desktop\\chromedriver.exe”) 上收到错误消息
- google-cloud-platform - Cloud Run:429:请求被中止,因为没有可用的实例
- python - matplotlib 中的烛台
- laravel - 如何通过 Postman 在 Laravel 中测试 Api?
- nas - 使用卓越 2 是否可以与个人 NAS 而不是卓越的云同步文件?
- c++ - 使用智能感知检测 C++ 中变量的赋值
- javascript - 在浏览器中使用 handlebars.js。如何?需要吗?常见的?AMD?通天塔?什么?
- javascript - Object.assign / 未定义的对象键
- javascript - Firebase 实时数据库无法正常工作
- reactjs - 测试按钮单击 ReactJS 上是否呈现另一个组件