2012-11-08 24 views
6

我意识到这个问题已经被问了几次,但我找不到任何相关的答案在我的搜索。Bash脚本SSH进入一台机器时不提示密码,也不使用密钥

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

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

我目前的实施看起来是这样的:

function s() { 
ssh [email protected]$1 
} 

当我运行它,我得到这样的:

~]s 122 

ssh [email protected] 

[email protected]'s password: 

使用bash,而不是使用RSA密钥我想获得这使用默认密码“密码”。

我已经尝试了以下IP和用户已被设置。

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

它给人的follwing错误:

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

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

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

是否产卵命令设置环境?如果没有,那么路径将不会被设置,并且它不会知道在哪里寻找'ssh'。尝试将可执行文件的完整路径。 – Jay

+0

想知道,你对RSA密钥有什么反感?我在建立一个新系统时总是要做的第一件事是授权一个RSA密钥。 – mpontillo

+0

我不想使用RSA密钥,因为我正在使用很多不同的服务器,这些服务器的生命周期非常有限,而且这个脚本将会被很多人使用。想法是通过不必每次输入相同的密码。如果我每次第一次访问一台新机器时都必须输入密码才能使用ssh-copy-id,那么密钥就会失败。 – SuperTetelman

回答

7

你可以用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 [email protected]$addr 
expect "[email protected]$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 [email protected] 
    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" 
} 

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

另外:我知道你说安全性不是问题,但我想再次注意,不使用密码ssh的“正确”方式是使用ssh密钥对=)

+0

@Kevin:Negative:http://www.pantz.org/software/expect/expect_examples_and_tips.html –

+1

我使用\ n和\ r作为期望脚本。其中一个推荐吗? – SuperTetelman

4

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

例如,当密码是password.txt文件:

sshpass -fpassword.txt ssh [email protected] 

sshpass runs ssh in a dedicated tty , fooling it into thinking it is getting the password from an interactive user.

相关问题