You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:14:34