我有一个 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()
print(f'{tar_file_path} SENT TO 38:/app2/upload/')
它给我一个错误,说 child.interact() 有问题
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')
我在 nohup 进程中运行脚本,我相信这是导致此问题的原因。因为当我在控制台中运行脚本时,它工作正常。如何使用 pexpect 模块在 nohup 进程中与 scp 密码交互? (我无法在我的环境中安装任何其他外部模块)
答案 0 :(得分:1)
interact()
用于与衍生进程的手动交互,它需要在 tty 上运行,但 nohup
不提供 tty。您可以将 child.interact()
替换为 child.expect(pexpect.EOF, timeout=None)
。