本地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
相关产品推荐
相关产品推荐

