一. 服务器 SSH 登录
日常工作中 SSH 登录服务器查看问题排查问题已经是常规操作,但是最近由于需要在服务器上做一些繁琐的操作重复测试一些东西,干脆就想写一个脚本去一键操作,最开始想到的是 shell 脚本,无奈 shell 这语言太让人头大,写过一次不想写二次的那种,而且需要在目标服务器上执行。在百度了之后发现 python 有 SSH 登录服务器的库,拿来一用测试发现还是很给力,记录下来当时刚接触时候的一些疑问和操作。
二. 脚本操作
1.登录服务器
2.上传文件
3.切换用户
4.执行 shell 脚本
5.获取脚本输出,执行完成自动退出
三. python 脚本
脚本执行命令:python3 update_metadata.py 127.0.0.1 /root/test.text
import csv
import sys
# pip3 install paramiko 安装
import paramiko
host = sys.argv[1]
password = 'password'
local_path = sys.argv[2]
file_name = local_path[local_path.rfind('/') + 1:]
server_path = "/home/" + file_name
hdfs_base_path = "/home/"
hdfs_path = hdfs_base_path + file_name
# shell操作
ssh = paramiko.SSHClient() # 创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机
ssh.connect(hostname=host, port=22, username='root', password=password)
# exec 执行是以 root 用户执行,由于服务器的限制我这里无法直接登录到我需要的用户
ssh.exec_command(server_path)
# 使用 sftp 上传本地文件到服务器
sftp = ssh.open_sftp()
sftp.put(local_path, server_path)
channel = ssh.invoke_shell()
# 切换到需要执行下列命令的用户
channel.send(bytes("su - other_user\n"))
# 执行服务器上的 shell 脚本
channel.send(bytes("sh test.sh %s\n" % hdfs_path))
# 命令超时时间,不然不知道什么时候 shell 脚本执行结束
channel.settimeout(4)
# 上面的超时时间是每一次调用 recv 如果超过设置的时间没有接收到消息就会中断
output_result = channel.recv(1500)
try:
while str(output_result):
# 打印服务器上执行上述命令的输出,判断执行结果
print(output_result.decode("utf-8"))
output_result = channel.recv(1500)
except Exception as e:
pass
ssh.close() # 关闭连接