规避ssh交互密码-自动化登录神器sshpass

简介:sshpass 是一款用于简化 SSH 自动化登录的工具,它允许在脚本中通过非交互的方式传递密码,从而自动登录到远程服务器,使得我们可以更高效地管理 SSH 登录过程。

历史攻略:

Linux:sudo免密

设置免密执行特定命令

Docker容器中的SSH免密登录

visudo:基本操作和保存退出

Python:paramiko+shell交互式处理sudo等交互输入密码等场景

使用 sshpass 的好处:

  1. 自动化脚本支持:便于在自动化脚本执行SSH登录,无需人工输入。

  2. 简化操作:通过命令行参数传递密码,减少了手动输入的繁琐。

  3. 提高效率:在批量管理服务器时,减少了登录过程的时间开销。

  4. 兼容性强:支持大多数需要密码认证的 SSH 工具和脚本。

  5. 方便测试:在测试环境中可以快速配置和使用。

安装 sshpass:

  1. 在 Debian/Ubuntu 系统上安装:
sudo apt-get update
sudo apt-get install sshpass
  1. 在 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 命令。

  1. 使用 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
  1. 使用 SCP 传输文件:
# -*- coding: utf-8 -*-
# time: 2024/09/04 21:18
# file: sshpass_command.py
# author: tom
# 微信公众号: 玩转测试开发
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 命令和传输文件。在使用时,请注意密码的安全性和管理,以确保系统的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值