1. 使用paramiko 库
2. 实现sftp 文件上传
3. 实现ssh 通过root 权限执行命令
import os
import paramiko
import time
# hostname = "10.0.0.99"
# username = "liantong"
# password = "liantong123"
def upload_files(hostname, username, password, files):
# http_daemon_file = "http-server-haifan-daemon"
# deepstream_file = "deepstream-haifan-multistream"
# rc_local = "rc.local"
# 1 创建transport通道
tran = paramiko.Transport((hostname, 22))
tran.connect(username=username, password=password)
# 2 创建sftp实例
sftp = paramiko.SFTPClient.from_transport(tran)
# 3 执行上传功能
remote_path = "/home/liantong/" # 远程路径
for f in files:
f = f.strip('\n')
print("upload file {}".format(f))
put_info = sftp.put(f, remote_path + f, confirm=True)
print(put_info)
# 5 关闭通道
tran.close()
def exec_root_cmd(hostname, username, password, cmd):
s = paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname=hostname, port=int(22), username=username, password=password)
ssh = s.invoke_shell()
time.sleep(1)
ssh.send('sudo su')
ssh.send('\n')
buff = ''
while not buff.endswith('password for liantong: '):
resp = ssh.recv(9999)
buff += resp.decode('utf-8')
# print(resp.decode('utf-8'))
# print(buff)
ssh.send(password)
ssh.send('\n')
buff = ''
while not buff.endswith('# '):
resp = ssh.recv(9999)
buff += resp.decode('utf-8')
print(resp.decode('utf-8'))
# stdin, stdout, stderr = s.exec_command(cmd)
# result = stdout.read()
# print(result)
ssh.send(cmd)
ssh.send('\n')
buff = ''
while not buff.endswith('# '):
resp = ssh.recv(9999)
buff += resp.decode('utf-8')
print(resp.decode('utf-8'))
print("exec cmd {} done ...".format(cmd))
s.close()
def update_server_files(hostname, username, password, files):
exec_root_cmd(hostname, username, password, "ps -ef |grep http-server-haifan-daemon|awk '{print $2}' |xargs kill -9")
exec_root_cmd(hostname, username, password, "ps -ef |grep deepstream-haifan-multistream|awk '{print $2}' |xargs kill -9")
time.sleep(1.2)
http_daemon_file = "http-server-haifan-daemon"
deepstream_file = "deepstream-haifan-multistream"
rc_local = "rc.local"
jar_file = "video-analyse-0.0.1-SNAPSHOT.jar"
for f in files:
f = f.strip('\n')
if f == http_daemon_file:
exec_root_cmd(hostname, username, password, "cp /home/liantong/" + http_daemon_file + " /opt/multistream_server/core_server/" + http_daemon_file)
elif f == deepstream_file:
exec_root_cmd(hostname, username, password, "cp /home/liantong/" + deepstream_file + " /opt/multistream_server/core_server/" + deepstream_file)
elif f == rc_local:
exec_root_cmd(hostname, username, password, "cp /home/liantong/" + rc_local + " /etc/" + rc_local)
elif f == jar_file:
exec_root_cmd(hostname, username, password, "cp /home/liantong/" + jar_file + " /opt/multistream_server/web_server/" + rc_local)
def clean_server_files(hostname, username, password, files):
for f in files:
f = f.strip('\n')
exec_root_cmd(hostname, username, password, "rm /home/liantong/" + f)
# 所有需要更新的IP列表
ip_file = "ip_config.txt"
# 需要更新的文件列表
update_file = "update_file.txt"
with open(ip_file) as f:
ips = f.readlines()
with open(update_file) as f:
update_files = f.readlines()
for ip in ips:
ip = ip.strip('\n')
print("try to update {} ...".format(ip))
upload_files(ip, "root", "123", update_files)
update_server_files(ip, "root", "123", update_files)
clean_server_files(ip, "root", "123", update_files)
print("update {} done ...".format(ip))