在nohup进程中尝试scp时出现预期错误
我有一个scp功能,如下所示:在nohup进程中尝试scp时出现预期错误,scp,pexpect,nohup,Scp,Pexpect,Nohup,我有一个scp功能,如下所示: def scp_to38(): child = pexpect.spawn(f"scp {tar_file_path} bbmprd@10.82.20.38:/app2/upload/") child.expect(f"bbmprd@10.82.20.38's password:") child.sendline("password") child.interact()
def scp_to38():
child = pexpect.spawn(f"scp {tar_file_path} bbmprd@10.82.20.38:/app2/upload/")
child.expect(f"bbmprd@10.82.20.38's password:")
child.sendline("password")
child.interact()
print(f'{tar_file_path} SENT TO 38:/app2/upload/')
这让我犯了一个错误,说child有问题
回溯(最近一次呼叫最后一次):
文件“scan_for_upload.py”,第39行,在
scp_to38()
文件“scan_for_upload.py”,第26行,在scp_至38中
child.interact()
文件“/app/anaconda3/envs/python37-1/lib/python3.7/site packages/pexpect/pty_spawn.py”,第788行,在interact中
mode=tty.tcgetattr(self.STDIN\u文件号)
termios.error:(25,“设备的ioctl不正确”)
我正在nohup进程中运行脚本,我认为这是导致此问题的原因。因为当我在控制台中运行脚本时,它工作得很好。如何使用pexpect模块在nohup进程中与scp密码交互?(我无法在我的环境中安装任何其他外部模块)
interact()
用于与生成的进程进行手动交互,它需要在tty上运行,但nohup
不提供tty。您可以将child.interact()
替换为child.expect(pexpect.EOF,timeout=None)
而不是执行系统调用,请尝试此操作。不幸的是,我的环境没有scp软件包,无法安装任何外部软件包谢谢,看起来scp工作正常,但是日志给出了一条错误消息,说明超时已超过。你知道为什么吗?我应该在末尾添加child.close()之类的内容吗?通过再添加一个timeout
param更新。默认情况下,超时时间为30秒。
Traceback (most recent call last):
File "scan_for_upload.py", line 39, in <module>
scp_to38()
File "scan_for_upload.py", line 26, in scp_to38
child.interact()
File "/app/anaconda3/envs/python37-1/lib/python3.7/site-packages/pexpect/pty_spawn.py", line 788, in interact
mode = tty.tcgetattr(self.STDIN_FILENO)
termios.error: (25, 'Inappropriate ioctl for device')