【发布时间】:2023-03-10 18:24:01
【问题描述】:
我想使用 python 自动执行特定任务。
除其他外,此任务包括通过 ssh 连接到远程服务器,以及运行可能会或可能不会要求用户输入的特定程序(称为 prog.out)。
经过一些研究和权衡我的选择后,我决定使用 Python 的 Paramiko(考虑到以下内容,这可能是错误的......)。
让我们从prog.out 不询问任何输入,而只是将一些信息打印到控制台的简单可能性开始:
int main(int argc, char* argv[]) {
printf("Hey there, fella\n");
printf("How are you this morning?\n");
printf("See ya...\n");
return 0;
}
编译为:prog.out,并位于 server_name 上,等待执行。
所以在那种情况下:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("server_name")
sin, sout, serr = client.exec_command('./prog.out')
for line in sout.readlines():
print(line, end = '')
可以正常工作,并且会打印出prog.out 生成的任何内容。
但如果不是 prog.out 是:
int main(int argc, char* argv[]) {
printf("Hey there, fella\n");
printf("How are you this morning?\n");
printf("please enter an integer...\n");
int a;
scanf("%d", &a);
printf("you entered %d\n", a);
printf("see ya...\n");
return 0;
}
那么上面的python代码会在sout.readlines()阻塞(等待eof?)...
避免在sout.readlines() 中阻塞的方法是通过写入prog.out 的标准输入管道来为prog.out 提供输入:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("server_name")
sin, sout, serr = client.exec_command('./prog.out')
sin.write('55\n')
for line in sout.readlines():
print(line, end = '')
但我无法提前知道prog.out 是否需要用户输入...
我正在寻找一种稳健的方式来运行prog.out,并让用户在必要时与它进行交互。
prog.out 需要输入时是否有一些迹象?
编辑
好的,我做了一点实验,发现只要prog.out没有退出,任何从通道读取()的尝试都会阻塞,但是prog.out只要没有退出就不能退出'未提供输入...prog.out 已经发送的字节怎么还没读完呢?
我真的很想模拟给用户,就好像他或她直接与prog.out交互...
【问题讨论】: