使用 python 通过 SSH 通过管道传输 Tar 的文件
File transfer with Tar piped through SSH using python
我想运行变成python一个命令,例如:
tar -cf - files | ssh -c arcfour128 user@remote "tar -xf - -C /directory/"
我显然可以使用 subprocess.run
:
subprocess.run("""tar -cf - %s | ssh -c arcfour128 user@remote "tar -xf - -C /directory/" """ % file_list ,shell=True))
但是这样的命令既不提供进度信息也不提供简单的异常管理。
有没有办法使用本机 python 代码使用库 tarfile 和 paramiko 来做到这一点?谢谢
您可以使用 paramiko 的 SFTP
客户端来完成。有几种方法可以打开 sftp 传输(请参阅 docs and demo),但为了简单起见,这里是一个示例,我在其中计算传输的文件并使用 put
函数的回调进行中间进度。
import paramiko
from glob import glob
import posixpath
def xfer_callback(cur, total):
print("{}...{}".format(cur, total))
ssh_client =paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname="localhost",username="td",
password="notmyrealpassword")
ftp = ssh_client.open_sftp()
remote_base = "/home/td/tmp/deleteme"
files = glob("*.py")
count = 1
for fn in files:
print("sending {} of {}".format(count, len(files)))
ftp.put(fn, posixpath.join(remote_base, fn), xfer_callback)
count += 1
示例输出
$ python3 test.py
sending 1 of 6
411...411
sending 2 of 6
557...557
sending 3 of 6
453...453
sending 4 of 6
1117...1117
sending 5 of 6
32768...118000
65536...118000
98304...118000
118000...118000
sending 6 of 6
515...515
我想运行变成python一个命令,例如:
tar -cf - files | ssh -c arcfour128 user@remote "tar -xf - -C /directory/"
我显然可以使用 subprocess.run
:
subprocess.run("""tar -cf - %s | ssh -c arcfour128 user@remote "tar -xf - -C /directory/" """ % file_list ,shell=True))
但是这样的命令既不提供进度信息也不提供简单的异常管理。 有没有办法使用本机 python 代码使用库 tarfile 和 paramiko 来做到这一点?谢谢
您可以使用 paramiko 的 SFTP
客户端来完成。有几种方法可以打开 sftp 传输(请参阅 docs and demo),但为了简单起见,这里是一个示例,我在其中计算传输的文件并使用 put
函数的回调进行中间进度。
import paramiko
from glob import glob
import posixpath
def xfer_callback(cur, total):
print("{}...{}".format(cur, total))
ssh_client =paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname="localhost",username="td",
password="notmyrealpassword")
ftp = ssh_client.open_sftp()
remote_base = "/home/td/tmp/deleteme"
files = glob("*.py")
count = 1
for fn in files:
print("sending {} of {}".format(count, len(files)))
ftp.put(fn, posixpath.join(remote_base, fn), xfer_callback)
count += 1
示例输出
$ python3 test.py
sending 1 of 6
411...411
sending 2 of 6
557...557
sending 3 of 6
453...453
sending 4 of 6
1117...1117
sending 5 of 6
32768...118000
65536...118000
98304...118000
118000...118000
sending 6 of 6
515...515