gpt4 book ai didi

python - 如何使用 SCP 或 SSH 在 Python (paramiko) 中递归地将完整目录复制到远程服务器?

转载 作者:行者123 更新时间:2023-12-01 01:30:11 29 4
gpt4 key购买 nike

我的本​​地计算机上有一个包含一些文件和子目录的目录,该目录是由日常运行的 Python 脚本生成的。然后我想将目录中所有生成的文件复制到服务器,然后使用 python 包 paramiko 通过 ssh 对其运行一系列命令。

我想添加一些代码,以使用 python 的 paramiko 包通过 SSH/SCP 将整个目录以及其中的文件和子目录安全地复制到我的服务器。我可以使用相同的方法发送单个文件,但无法使用 paramiko 发送整个目录及其内容。它给我 IOError 说它是一个目录。

IOError: [Errno 21] Is a directory: 'temp'

这是我的代码:

from paramiko import SSHClient, AutoAddPolicy
from scp import SCPClient

class SSh(object):

def __init__(self, address, username, password, port=22):
print "Connecting to server."
self._address = address
self._username = username
self._password = password
self._port = port
self.sshObj = None
self.connect()
self.scp = SCPClient(self.sshObj.get_transport())

def sendCommand(self, command):
if(self.sshObj):
stdin, stdout, stderr = self.sshObj.exec_command(command)
while not stdout.channel.exit_status_ready():
# Print data when available
if stdout.channel.recv_ready():
alldata = stdout.channel.recv(1024)
prevdata = b"1"
while prevdata:
prevdata = stdout.channel.recv(1024)
alldata += prevdata

print str(alldata)
else:
print "Connection not opened."

def connect(self):
try:
ssh = SSHClient()
ssh.set_missing_host_key_policy(AutoAddPolicy())
ssh.connect(self._address, port=self._port, username=self._username, password=self._password, timeout=20, look_for_keys=False)
print 'Connected to {} over SSh'.format(self._address)
return True
except Exception as e:
ssh = None
print "Unable to connect to {} over ssh: {}".format(self._address, e)
return False
finally:
self.sshObj = ssh

if __name__ == "__main__":
# Parse and check the arguments
ssh = SSh('10.24.143.190', 'username', 'password')
ssh.scp.put("Valigrind_BB.py") # This works perfectly fine
ssh.scp.put("temp") # IOError over here Is a directory
ssh.sendCommand('ls')

提前谢谢您。

最佳答案

查看 SCP 的源代码,您似乎可以将参数“recursive”作为 bool 传递给 put() 方法,以指定递归地传输目录内容。 Here是我正在谈论的源代码的链接。尝试将代码的最后部分更改为以下内容:

if __name__ == "__main__":
# Parse and check the arguments
ssh = SSh('10.24.143.190', 'username', 'password')
ssh.scp.put("Valigrind_BB.py") # This works perfectly fine
ssh.scp.put("temp", recursive=True) # IOError over here Is a directory
ssh.sendCommand('ls')

此外,如果您只想传输文件,可以尝试 rsync 作为替代方案。对上面代码的修改应该可以工作。我希望这会有所帮助。

关于python - 如何使用 SCP 或 SSH 在 Python (paramiko) 中递归地将完整目录复制到远程服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52954532/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com