使用 Python Paramiko exec_command 执行时命令未完成
A command does not finish when executed using Python Paramiko exec_command
我有一个 Python 程序,它位于远程服务器上,它在 运行 时将文件上传到 AWS 存储桶。如果我 ssh 到服务器并使用命令 sudo python3 /path/to/backup.py
运行 它按预期工作。
我正在编写一个 Python 程序来自动化一个更大的过程,其中包括 运行ning backup.py。我使用 paramiko 库创建了一个函数来执行此操作。这是命令获得 运行
的地方
ssh_stdin, ssh_stdout, ssh_stderr = self.ssh.exec_command('sudo python3 /path/to/backup.py', 1800)
logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
logging.debug(f'ssh_stderr: {ssh_stderr.readline()}')
我的自动化给了我这个输出:
ssh_stdout: Tue, 19 May 2020 14:36:43 INFO The COS endpoint is 9.11.200.206, writing to vault: SD_BACKUP_4058
此后程序不执行任何操作。当我登录到服务器并查看 backup.py
的日志时,我可以看到它仍然是 运行ning 并且似乎正等待文件上传。这是它卡在的代码:
s3_client.upload_file(
Filename=BACKUP,
Bucket=BUCKET_NAME,
Key=SPLIT_FILE_NAME,
Callback=pp(BACKUP),
Config=config)
我不明白为什么它在我的自动化程序启动时卡在此处,而不是在我从终端的命令行 运行 时卡住。我在日志中看不到任何对我有帮助的东西。它似乎只是停留在执行的那个点上。会不会和回调没有返回有关?
您只读了一行输出。
logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
如果远程程序产生大量输出,一旦其输出缓冲区填满,程序就会在下一次尝试写入一些输出时挂起。
如果你想让程序完成,你必须继续阅读输出。
最简单的方法是使用readlines
或read
:
print(stdout.read())
但这对于像您这样的大输出来说效率很低。
相反,您可以逐行阅读输出:
for line in stdout:
print(line.strip())
当命令还产生错误输出时,情况会变得更加复杂,因为那时您必须读取两个输出流。
参见 。
我有一个 Python 程序,它位于远程服务器上,它在 运行 时将文件上传到 AWS 存储桶。如果我 ssh 到服务器并使用命令 sudo python3 /path/to/backup.py
运行 它按预期工作。
我正在编写一个 Python 程序来自动化一个更大的过程,其中包括 运行ning backup.py。我使用 paramiko 库创建了一个函数来执行此操作。这是命令获得 运行
的地方ssh_stdin, ssh_stdout, ssh_stderr = self.ssh.exec_command('sudo python3 /path/to/backup.py', 1800)
logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
logging.debug(f'ssh_stderr: {ssh_stderr.readline()}')
我的自动化给了我这个输出:
ssh_stdout: Tue, 19 May 2020 14:36:43 INFO The COS endpoint is 9.11.200.206, writing to vault: SD_BACKUP_4058
此后程序不执行任何操作。当我登录到服务器并查看 backup.py
的日志时,我可以看到它仍然是 运行ning 并且似乎正等待文件上传。这是它卡在的代码:
s3_client.upload_file(
Filename=BACKUP,
Bucket=BUCKET_NAME,
Key=SPLIT_FILE_NAME,
Callback=pp(BACKUP),
Config=config)
我不明白为什么它在我的自动化程序启动时卡在此处,而不是在我从终端的命令行 运行 时卡住。我在日志中看不到任何对我有帮助的东西。它似乎只是停留在执行的那个点上。会不会和回调没有返回有关?
您只读了一行输出。
logging.debug(f'ssh_stdout: {ssh_stdout.readline()}')
如果远程程序产生大量输出,一旦其输出缓冲区填满,程序就会在下一次尝试写入一些输出时挂起。
如果你想让程序完成,你必须继续阅读输出。
最简单的方法是使用readlines
或read
:
print(stdout.read())
但这对于像您这样的大输出来说效率很低。
相反,您可以逐行阅读输出:
for line in stdout:
print(line.strip())
当命令还产生错误输出时,情况会变得更加复杂,因为那时您必须读取两个输出流。
参见