初始化 SSH 和 SFTP
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
transport = paramiko.Transport((ipaddr, int(loginPort)))
transport.connect(username=username, password=password)
ssh = paramiko.SSHClient()
ssh._transport = transport
sftp = paramiko.SFTPClient.from_transport(transport)
远程执行命令
stdin, stdout, stderr = ssh.exec_command("chmod +x *.sh && nohup ./deploy.sh >> deploy.log 2>&1 &")
上传与下载文件
def sftp_upload_file(server_path, local_path):
try:
t = paramiko.Transport((ip, 22))
t.connect(username=user, password=pwd)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put(local_path, server_path)
t.close()
except Exception as e:
print(e)
def sftp_down_file(server_path, local_path):
try:
t = paramiko.Transport((ip, 22))
t.connect(username=user, password=pwd)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.get(server_path, local_path)
t.close()
except Exception as e:
print(e)
若当前登录用户不为 Root ,则将当前用户密码设置为 Root 密码
if (username != 'root'):
stdin, stdout, stderr = ssh.exec_command( \
'''echo '{CPASSWD}' | sudo -S sh -c "echo '{CPASSWD}' | sudo -S passwd --stdin root" >> execlog.log 2>&1 '''
.format(CPASSWD=password))
stdin, stdout, stderr = ssh.exec_command( \
'''echo '{CPASSWD}' | sudo -S sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin kafka/g' /etc/ssh/sshd_config && echo '{CPASSWD}' | sudo -S sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication kafka/g' /etc/ssh/sshd_config'''
.format(CPASSWD=password))
上传整个文件夹
def put_all(self,localpath,remotepath):
os.chdir(os.path.split(localpath)[0])
parent=os.path.split(localpath)[1]
for walker in os.walk(parent):
try:
self.sftp.mkdir(os.path.join(remotepath,walker[0]))
except:
pass
for file in walker[2]:
self.put(os.path.join(walker[0],file),os.path.join(remotepath,walker[0],file))
下载整个文件夹
def get_all(self,remotepath,localpath):
self.sftp.chdir(os.path.split(remotepath)[0])
parent=os.path.split(remotepath)[1]
try:
os.mkdir(localpath)
except:
pass
for walker in self.sftp_walk(parent):
try:
os.mkdir(os.path.join(localpath,walker[0]))
except:
pass
for file in walker[2]:
self.get(os.path.join(walker[0],file),os.path.join(localpath,walker[0],file))
Python 中 os.system 和 os.popen 区别
os.system()的返回值只会有0(成功),1,2;
os.popen()会把执行命令的输出作为值返回,可实现一个“管道”,从这个命令获取的值可以继续被调用。
评论
发表评论