【问题标题】:Bash Script to SSH into a machine without prompting password and without using keys在不提示密码且不使用密钥的情况下通过 SSH 连接到机器的 Bash 脚本
【发布时间】:2012-10-29 04:58:12
【问题描述】:

我意识到这个问题已被问过几次,但我在搜索的任何地方都找不到相关的答案。

我在一个安全不是问题的开发环境中工作,任何人只要考虑几秒钟就可以猜出密码。

我想做的很简单。我在我的本地 .bashrc 文件中创建了一个别名函数,我希望这个函数能够使用默认密码自动登录机器。

我当前的实现如下所示:

function s () { 
 ssh root@192.168.1.$1
}

当我运行它时,我会得到这样的结果:

~]s 122

ssh root@192.168.1.122

root@192.168.1.122's password: 

使用 Bash,而不是使用 RSA 密钥我想让它使用默认密码“密码”。

我已经尝试了以下已设置 IP 和用户的方法。

Do=$(expect -c "
spawn ssh $User@${IP[0]}.${IP[1]}.${IP[2]}.${IP[3]} 
expect \"yes/no\" 
send \"yes\r\" 
expect \"assword\" send \"password\"")
echo $Do
$Do

它给出了以下错误:

Connecting and logging into server using expect
usage: send [args] string
    while executing
"send"
    invoked from within
"expect "assword" send "password""
 Administrator@192.168.1.176's password:
bash: spawn: command not found...

使用以下命令我可以连接一台机器。如果我删除了交互,它只会运行 uptime 命令并关闭连接。使用交互命令,我无法看到我正在输入的内容或实际与机器交互。有什么想法吗?

Do=$(expect -c "spawn ssh $User@${IP[0]}.${IP[1]}.${IP[2]}.${IP[3]}; set timeout 4; expect \"assword\"; send \"password\n\"; expect \"test\"; send \"uptime\n\"; interact;");echo $Do;

【问题讨论】:

  • spawn 命令是否设置了环境?如果没有,则不会设置路径,并且它不知道在哪里寻找“ssh”。尝试将完整路径放入可执行文件。
  • 只是想知道,您对 RSA 密钥的反感是什么?设置新系统时,我总是做的第一件事就是授权 RSA 密钥。
  • 我不想使用 RSA 密钥,因为我正在使用许多生命周期非常有限的不同服务器,而且这个脚本将被很多人使用。这个想法是无需每次都输入相同的密码,从而节省时间。如果我每次第一次访问新机器时都必须输入密码来 ssh-copy-id ,那么它上面的密钥就达不到目的了。
  • @Jay 你是说 expect 的 spawn 命令不知道如何处理 ssh 而我应该改用 /bin/ssh 吗?
  • @SuperTetelman,为什么不将 RSA 密钥与脚本一起提供并让脚本使用 ssh -i <key>

标签: bash ssh


【解决方案1】:

您可以使用expect 工具执行此操作:http://expect.sourceforge.net/

它广泛可用,因此取决于您的系统,相当于sudo apt-get install expectyum install expect 将安装它。

这是一个带有 ssh 的 expect 脚本示例。这会让您登录并控制交互式提示:

#!/usr/bin/expect

set login "root"
set addr "127.0.0.1"
set pw "password"

spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "cd /developer\r"
interact

这是一个如何将expect 用作 bash 脚本一部分的示例。这使用 ssh 登录,cd 到 /var,运行脚本,然后退出 ssh 会话。

#!/bin/bash
...

login_via_ssh_and_do_stuff() {

    # build the expect script in bash

    expect_sh=$(expect -c "
    spawn ssh root@127.0.0.1
    expect \"password:\"
    send \"password\r\"
    expect \"#\"
    send \"cd /var\r\"
    expect \"#\"
    send \"chmod +x my_script.sh\r\"
    expect \"#\"
    send \"./my_script.sh\r\"
    expect \"#\"
    send \"exit\r\"
    ")

    # run the expect script
    echo "$expect_sh"
}

您可以将这些 sn-ps 保留在本地系统上的脚本中,然后只是脚本的别名。

另外:我知道你说安全不是问题,但我想再次指出,不使用密码进行 ssh 的“正确”方法是使用 ssh 密钥对 =)

【讨论】:

【解决方案2】:

使用 sshpass,它在主要 Linux-es 的软件包存储库中可用。

例如,当密码在password.txt文件中时:

sshpass -fpassword.txt ssh username@hostname

sshpass 在专用的tty 中运行ssh,欺骗它认为它是 从交互式用户那里获取密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2018-06-29
    • 1970-01-01
    • 2012-12-17
    • 2017-02-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多