尝试在 nohup 进程中执行 scp 时出现 pexpect 错误

时间:2021-04-22 02:46:59

标签: 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()
    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 密码交互? (我无法在我的环境中安装任何其他外部模块)

1 个答案:

答案 0 :(得分:1)

interact() 用于与衍生进程的手动交互,它需要在 tty 上运行,但 nohup 不提供 tty。您可以将 child.interact() 替换为 child.expect(pexpect.EOF, timeout=None)