在执行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'
注:如果需要输入回车,需要使用空行而不是
\n