0
点赞
收藏
分享

微信扫一扫

shell自动交互subprocess及paramiko处理shell命令行交互的方法


在执行shell文件时有时候会遇到shell中包含read方法以供用户进行输入。

使用Python在运行这种shell时,本地shell可以使用subprocess.run中的input参数进行输入,示例如下:

import subprocess
cmd = "sh -c 'read v; sleep 1; echo $v'"
# 通过input参数指定要输入的字符串, bytes类型
p = subprocess.run(cmd, stdout=subprocess.PIPE, input=b'hello,world\n', shell=True)
print(p.stdout.decode('utf-8'))

远程主机shell可以通过paramiko执行命令exec_command返回的stdin的stdin.channel.send来进行输入,示例如下:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='******', port=22, username='root', password='******')
cmd = "sh -c 'read v; sleep 1; echo $v'"
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.channel.send(b'hello,world\n') # 输入字符串,bytes类型
stdin.channel.shutdown_write() # 结束输入
print(stdout.read().decode('utf-8'))

如果直接使用shell处理其他shell中的read命令,则可以使用echo 配合管道符实现,示例如下:

echo 'hello,world' | sh -c 'read v; sleep 1; echo $v'



举报

相关推荐

0 条评论