使用asyncssh在远程服务器执行df命令报错,仅ls命令可用
解决asyncssh执行
df命令报“Command not found”的问题 这个问题的核心原因是asyncssh默认启动的是非交互式、非登录Shell,这种Shell加载的环境变量(尤其是PATH)会比你平时通过SSH终端登录时更精简。ls通常在默认的PATH目录(比如/bin)里,所以能正常执行;但df可能位于/usr/bin或者其他不在当前PATH的目录中,导致Shell找不到它。
下面是几种可行的解决方案:
1. 使用df的绝对路径执行
先在目标服务器上通过终端登录,执行which df命令确认df的绝对路径(通常是/bin/df或/usr/bin/df),然后在代码中直接使用这个路径:
import asyncssh client_key = asyncssh.read_private_key(RSA_KEY) async with asyncssh.connect( client_factory=None, host=SERVER_HOST, username=SERVER_USERNAME, port=SERVER_PORT, client_keys=[client_key] ) as conn: # 替换成你通过which df得到的绝对路径 res = await conn.run('/bin/df') print(res.stdout)
如果不确定路径,也可以先通过asyncssh执行which df来查询:
res = await conn.run('which df') print(res.stdout) # 输出df的绝对路径
2. 手动扩展PATH环境变量
在执行df前先扩展PATH,确保包含df所在的目录:
import asyncssh client_key = asyncssh.read_private_key(RSA_KEY) async with asyncssh.connect( client_factory=None, host=SERVER_HOST, username=SERVER_USERNAME, port=SERVER_PORT, client_keys=[client_key] ) as conn: # 扩展PATH后执行df,可根据实际情况添加更多目录 res = await conn.run('export PATH=$PATH:/bin:/usr/bin && df') print(res.stdout)
3. 调整服务器的Shell环境配置
如果希望所有asyncssh连接都能自动加载完整的PATH,可以修改服务器上的Shell配置文件:
- 对于Bash,编辑
~/.bash_profile(登录Shell加载)或/etc/profile(全局配置),添加PATH的扩展语句,比如:export PATH=$PATH:/bin:/usr/bin - 注意:非交互式Shell通常不会加载
~/.bashrc,所以修改这个文件可能无效,优先选择~/.bash_profile或全局配置。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

