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

本地Python通过Paramiko执行Linux Shell脚本无法传参的解决方法

解决Python通过Paramiko传递参数给远程交互Shell脚本的问题

问题根源

你的Shell脚本通过read命令从标准输入获取用户输入,而非读取命令行参数。直接在命令后追加1(如./zac.sh 1)不会被脚本识别,因为它没有处理$1这类命令行参数变量。

下面提供两种可行解决方案:


方案1:修改Shell脚本,支持命令行参数(推荐)

修改脚本使其优先读取命令行参数,无参数时保留原交互逻辑,兼顾手动运行和Python调用场景:

# 优先使用命令行参数,无参数则走交互流程
if [ $# -ge 1 ]; then
    choice=$1
else
    echo "Enter 1 to create a folder named 'Hello'"
    echo "Enter 0 to exit"
    read choice
fi

if [ $choice -eq 1 ]
then
    mkdir Hello
    echo "Folder 'Hello' created!"
elif [ $choice -eq 0 ]
then
    exit
else
    echo "Invalid choice"
fi

修改后,Python中的原有调用代码即可生效:

def script_run(ssh):
    path = '/home/pluszczu/logs'
    ssh.exec_command(f'cd {shlex.quote(path)} && ./zac.sh 1')

方案2:不修改Shell脚本,通过标准输入传递参数

如果无法修改远程Shell脚本,可通过Paramiko的标准输入管道模拟用户输入:

修改Python的script_run函数:

def script_run(ssh):
    path = '/home/pluszczu/logs'
    # 获取脚本的标准输入、输出、错误管道
    stdin, stdout, stderr = ssh.exec_command(f'cd {shlex.quote(path)} && ./zac.sh')
    # 向标准输入写入参数(模拟用户输入1并回车)
    stdin.write("1\n")
    stdin.flush()  # 强制发送数据,避免缓存
    # 可按需读取输出验证结果
    print("脚本输出:", stdout.read().decode())
    print("错误信息:", stderr.read().decode())

内容的提问来源于stack exchange,提问作者Mateusz Plsz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:42:41