sshpass 是一款用于简化 SSH 自动化登录的工具,它允许在脚本中通过非交互的方式传递密码,从而自动登录到远程服务器,使得我们可以更高效地管理 SSH 登录过程。
使用 sshpass 的好处:
1. 自动化脚本支持:便于在自动化脚本执行SSH登录,无需人工输入。
2. 简化操作:通过命令行参数传递密码,减少了手动输入的繁琐。
3. 提高效率:在批量管理服务器时,减少了登录过程的时间开销。
4. 兼容性强:支持大多数需要密码认证的 SSH 工具和脚本。
5. 方便测试:在测试环境中可以快速配置和使用。
安装 sshpass:
1. 在 Debian/Ubuntu 系统上安装:
sudo apt-get update
sudo apt-get install sshpass
2. 在 CentOS/RHEL 系统上安装:
sudo yum install epel-release
sudo yum install sshpass
使用 sshpass 的基本示例:
1. 执行简单的 SSH 登录:假设需要通过 SSH 登录到远程服务器 remote.server.com 并执行命令 ls /var/log,可以使用以下命令:
sshpass -p 'your_password' ssh user@remote.server.com 'ls /var/log'
解析:
- -p ‘your_password’:指定 SSH 登录的密码。
- ssh user@remote.server.com ‘ls /var/log’:通过 SSH 执行 ls /var/log 命令。
2. 使用 sshpass 进行 SCP 文件传输:要将本地文件 file.txt 传输到远程服务器 /home/user/ 目录中,可以使用以下命令:
sshpass -p 'your_password' scp file.txt user@remote.server.com:/home/user/
解析:
- scp file.txt user@remote.server.com:/home/user/:将 file.txt 复制到远程服务器指定路径。
Python 封装示例:分别用于自动化 SSH 登录和 SCP 文件传输
1. 执行 SSH 命令:
# -*- coding: utf-8 -*-
# time: 2024/09/04 21:18
# file: sshpass_command.py
# author: tom
# 微信公众号: 玩转测试开发
import subprocess
def ssh_command(host: str, user: str, password: str, command: str) -> None:
"""
使用 sshpass 执行 SSH 命令。
:param host: 远程主机地址
:param user: SSH 用户名
:param password: SSH 密码
:param command: 要执行的命令
"""
sshpass_command = [
'sshpass', '-p', password, 'ssh', f'{user}@{host}', command
]
try:
result = subprocess.run(sshpass_command, check=True, text=True, capture_output=True)
print(f"命令输出:\n{result.stdout}")
except subprocess.CalledProcessError as e:
print(f"命令执行失败:\n{e.stderr}")
# 示例调用
if __name__ == "__main__":
ssh_command('remote.server.com', 'user', 'your_password', 'ls /home && pwd')
运行结果:
(base) tom@tom:~/tests$ python main.py
命令输出:
lighthouse
ubuntu
/home/ubuntu
2. 使用 SCP 传输文件:
# -*- coding: utf-8 -*-
# time: 2024/12/045 13:40
# file: sshpass_command.py
# author: 装系统的SRE运维
# 网站: www.linux66.cn
import subprocess
def scp_file(host: str, user: str, password: str, local_file: str, remote_path: str) -> None:
"""
使用 sshpass 进行 SCP 文件传输。
:param host: 远程主机地址
:param user: SSH 用户名
:param password: SSH 密码
:param local_file: 本地文件路径
:param remote_path: 远程文件路径
"""
scp_command = [
'sshpass', '-p', password, 'scp', local_file, f'{user}@{host}:{remote_path}'
]
try:
result = subprocess.run(scp_command, check=True, text=True, capture_output=True)
print(f"文件传输输出:\n{result.stdout}")
except subprocess.CalledProcessError as e:
print(f"文件传输失败:\n{e.stderr}")
# 示例调用
if __name__ == "__main__":
scp_file('remote.server.com', 'user', 'your_password', 'file.txt', '/home/user/')
注意事项:
1. 特别留心密码安全:在命令行中直接传递密码可能会被其他用户看到。考虑使用更安全的认证方法,如 SSH 密钥对。
2. 清理命令历史: 避免在命令历史中保存密码。可以通过使用环境变量或配置文件来存储密码。
3. 进行必要的权限控制:确保使用 sshpass 的脚本和命令具备适当的权限,避免不必要的风险。
4. 谨慎在生产环境的使用限制: sshpass 适用于简单的自动化任务,但不推荐用于生产环境中的敏感操作。
小结:sshpass 是一个方便的工具,特别适合需要在脚本中自动化 SSH 登录和操作的场景。通过上述 Python 封装示例,您可以更高效地执行 SSH 命令和传输文件。在使用时,请注意密码的安全性和管理,以确保系统的安全性。