Linux自动使用密码登陆SSH

neevop 十二月 14, 2022

常见误区

  1. 使用管道符传入明文ssh密码:

    echo password | ssh user@host
    

    这种做法并行不通。

实现脚本内ssh, scp自动验证密码

  • 方法 1:使用 expect 使用密码而不是密钥来执行 ssh

    我们可以利用 expect 以自动方式提供密码,而无需在 shell 脚本中提示用户。当涉及到需要用户输入的自动化时,Expect 是一个非常方便的工具。尽管缺点是任何人都可以打开脚本并检查密码,因为密码是纯文本格式。

    #!/usr/bin/expect
    
    set USER [lindex $argv ]
    set HOST [lindex $argv 1]
    set PWD [lindex $argv 2]
    log_file /var/log/ssh_tmp.log
    set timeout  30
    log_user  1
    set send_slow {1 .01}
    send_log  "Connecting to $HOST using $USER user\n"
    eval spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o Connecttimeout =30 "$USER\@$HOST"
    expect  {
            timeout       { send_user  "timeout  while connecting to $HOST\n"; exit }
            "*No route to host*" { send_user  "$HOST not reachable\n"; exit }
            "*assword: " { send -s $PWD\r }
            }
    expect  {
            timeout  { send_user  "timeout  waiting for prompt\n"; exit }
            "*]#"   { send_user  "Login successful to $HOST\n" }
            }
    send "hostname\r"
    
  • 方法 2:使用 sshpass 为 SSH 提供密码

    sshpass是一个实用程序,旨在使用称为“键盘交互”密码身份验证的模式运行 ssh,但处于非交互模式。此 rpm 作为 EPEL 存储库的一部分提供,不需要密钥即可执行 SSH。

    # for debian/ubuntu
    sudo apt-get install sshpass
    # for centos
    sudo yum install sshpass
    

    示例:

    sshpass -p "your_password" ssh -o StrictHostKeyChecking=no user@host
    

    注意:

    • sshpass -f传递参数时,还可以从文件中读取密码。如果执行命令,使用-f可防止密码可见。存储密码的文件应具有安全权限。
  • 方法 3:使用 Private Public passphrase 代替 password

    SSH 密钥是大多数系统的首选。它更不容易意外泄漏,因此非常适合安全。他们还鼓励基于身份的身份验证,因为 SSH 密钥通常绑定到创建它们的机器上,不会因为机器文件系统克隆或者网址变化而失效。

    SSH 将公钥存储在~/.ssh/id_rsa.pub 中,用于所有请求。生成新的密钥文件可以用如下命令,过程持续回车就可以:

    ssh-keygen -t rsa
    # or 基于密码的密钥对
    ssh-keygen -t rsa -P "new_password"
    

    需要将此公钥添加到要连接的服务器上的~/.ssh/authorized_keys 文件中。有一个内置的 SSH 命令可以为您轻松完成此操作:

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
    # or
    ssh-copy-id user@host
    

扩展阅读