使用脚本自动输入SSH密码

我需要创建一个脚本,自动输入密码到OpenSSH ssh客户端。

假设我需要用密码a1234b SSH到myname@somehost

我已经试过了……

#~/bin/myssh.sh
ssh myname@somehost
a1234b

...但这并不奏效。

如何将此功能放入脚本中?

752985 次浏览

使用公钥身份验证:https://help.ubuntu.com/community/SSH/OpenSSH/Keys

在源主机中只运行一次:

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost

这就是全部,之后你就可以不用密码使用ssh了。

您可以使用expect脚本。我没有写一个在相当长的一段时间,但它应该如下所示。你需要在脚本前面加上#!/usr/bin/expect

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact

首先你需要安装sshpass

  • Ubuntu / Debian: apt-get install sshpass
  • Fedora / CentOS: yum install sshpass
  • 拱:pacman -S sshpass

例子:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM

自定义端口示例:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400

注:

  • sshpass也可以在传递-f标志时从文件中读取密码。
    • 使用-f可以防止在执行ps命令时密码可见。
    • 存储密码的文件应具有安全权限。
    • 李< / ul > < / >

我得到了这个工作如下

.ssh/config被修改以消除是/否提示-我在防火墙后面,所以我不担心欺骗的ssh密钥

host *
StrictHostKeyChecking no

为expect创建一个响应文件,即answer.expect

set timeout 20
set node [lindex $argv 0]
spawn ssh root@node service hadoop-hdfs-datanode restart


expect  "*?assword {
send "password\r"   <- your password here.


interact

创建bash脚本并在文件中调用expect

#!/bin/bash
i=1
while [$i -lt 129]    # a few nodes here
  

expect answer.expect hadoopslave$i


i=[$i + 1]
sleep 5


done

获取128个用新配置刷新的hadoop datanode -假设您正在为hadoop/conf文件使用NFS挂载

希望这能帮助到一些人——我是一个Windows傻瓜,这花了我大约5个小时才弄明白!

不同的我

sshpass -p PASSWORD ssh USER@SERVER

变体二世

#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact

在寻找这个问题的答案几个月后,我终于找到了一个更好的解决方案:写一个简单的脚本。

#!/usr/bin/expect


set timeout 20


set cmd [lrange $argv 1 end]
set password [lindex $argv 0]


eval spawn $cmd
expect "password:"
send "$password\r";
interact

将它置为/usr/bin/exp,这样你就可以使用:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

完成了!

我有一个更好的解决方案,包括登录您的帐户,而不是更改为根用户。 它是一个bash脚本

http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/

# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1


# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh root@owned.com -p 22

参考:https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card

@abbotto的答案对我不起作用,不得不做一些不同的事情:

  1. yum install sshpass改为- RPM -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
  2. 使用sshpass的命令改为- SSH user@mysite -p 2122

通过shell脚本连接远程机器,使用以下命令:

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS

其中IPADDRESSUSERNAMEPASSWORD是需要在脚本中提供的输入值,或者如果我们想在运行时使用“read”命令提供。

sshpass具有更好的安全性

我在寻找ssh进入瘫痪服务器的方法时偶然发现了这个线程——处理ssh连接尝试花了一分钟多,在我输入密码之前超时了。在本例中,我希望在提示符可用时能够提供我的密码立即

(如果还不清楚的话:服务器处于这种状态,再设置公钥登录就太迟了。)

sshpass来拯救。然而,有比sshpass -p更好的方法。

我的实现直接跳到交互式密码提示(不会浪费时间查看是否可以进行公钥交换),并且从不以纯文本的形式显示密码。

#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh $@"


# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS
export SSHPASS


# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"


# clear the exported variable containing the password
unset SSHPASS

Sshpass + autossh

前面提到的sshpass的一个好处是,你可以将它与autossh一起使用,消除了更多的交互效率低下。

sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com

这将允许自动重新连接,如果你的wifi被打断,关闭你的笔记本电脑。

有一个跳转主机

sshpass -p `cat ~/.sshpass` autossh -M0 -Y -tt -J me@jumphost.mydomain.com:22223 -p 222 me@server.mydomain.com

我想我没有看到任何人提出这个建议,而操作人员只是说“脚本”,所以……

我需要解决同样的问题,而我最舒服的语言是Python。

我用了paramiko图书馆。此外,我还需要使用sudo发出需要升级权限的命令。事实证明,sudo可以通过“-S”标志通过stdin接受其密码!见下文:

import paramiko


ssh_client = paramiko.SSHClient()


# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())


# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)


# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"


ssh_client.connect(hostname="my.host.name.com",
username="username",
# Uncomment one of the following...
# password=password
# pkey=pkey
)


# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)


# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)


exit_status = chan.recv_exit_status()


if exit_status != 0:
stderr = chan.recv_stderr(5000)


# Note that sudo's "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.


logger.error("Uh oh")
logger.error(stderr)
else:
logger.info("Successful!")

希望这能帮助到一些人。我的用例是在大约300台服务器上创建目录、发送和解压文件以及启动程序。因此,自动化至关重要。我尝试了sshpassexpect,然后想出了这个。

在脚本中使用脚本tossh,第一个参数是主机名,第二个参数是密码。

#!/usr/bin/expect
set pass [lindex $argv 1]
set host [lindex $argv 0]
spawn ssh -t root@$host echo Hello
expect "*assword: "
send "$pass\n";
interact"

我设法让它工作了:

SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername

这是我登录服务器的方式:

ssp <server_ip>
  • alias ssp='/home/myuser/Documents/ssh_script.sh'
  • cat /home/myuser/Documents/ssh_script.sh

ssp:

#!/bin/bash


sshpass -p mypassword ssh root@$1

因此:

ssp server_ip

如果您在Windows系统上执行此操作,您可以使用Plink (PuTTY的一部分)。

plink your_username@yourhost -pw your_password

在ubuntu linux /

ssh username@server_ip_address -p port_number

按enter键,然后输入服务器密码

如果你不是根用户,那么在命令的开头添加sudo

在下面的例子中,我将写下我使用的解决方案:

场景:我想用sh脚本从服务器复制文件:

#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp userName@server-name:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")


echo "$my_script"

我使用下面的解决方案,但你必须安装sshpass如果它还没有安装,使用sudo apt install sshpass安装它

现在你可以这样做,

sshpass -p *YourPassword* ssh root@IP

您也可以创建一个bash别名,这样您就不必一次又一次地运行整个命令。 遵循以下步骤

cd ~

sudo nano .bash_profile

在文件末尾添加以下代码

mymachine() { sshpass -p *YourPassword* ssh root@IP }

source .bash_profile

现在只要从终端运行mymachine命令,你就会进入你的机器,没有密码提示。

注意:

  1. mymachine可以是你选择的任何命令。
  2. 如果在这个任务中安全性对您来说不重要,而您只想自动化工作,您可以使用此方法。

这基本上是abbotto的答案的扩展,有一些额外的步骤(针对初学者),使启动你的服务器,从你的linux主机,非常容易:

  1. 编写一个简单的bash脚本,例如:
#!/bin/bash


sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no <YOUR_USERNAME>@<SEVER_IP>
  1. 保存文件,例如'startMyServer',然后在你的终端上运行这个命令使文件可执行:
sudo chmod +x startMyServer
  1. 将文件移动到“PATH”变量中的文件夹(在终端中运行“echo $PATH”查看这些文件夹)。例如,将它移动到'/usr/bin/'。

瞧,现在你可以通过在终端中输入'startMyServer'进入服务器。

P.S.(1)这不是很安全,请查看ssh密钥以获得更好的安全性。

附注(2)SMshrimant的答案很相似,对一些人来说可能更优雅。但我个人更喜欢使用bash脚本。

这应该在大多数情况下都有帮助(你需要先安装sshpass !):

#!/usr/bin/bash
read -p 'Enter Your Username: ' UserName;
read -p 'Enter Your Password: ' Password;
read -p 'Enter Your Domain Name: ' Domain;


sshpass -p "$Password" ssh -o StrictHostKeyChecking=no $UserName@$Domain

如此:

#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
< p > ! !如果出现如下错误,只需使用expect启动脚本,而不是bash,如下所示:expect myssh.sh 而不是bash myssh.sh

/bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found

Solution1:使用sshpass

#~/bin/myssh.sh
sshpass -p a1234b ssh myname@somehost

您可以通过

# Ubuntu/Debian
$ sudo apt-get install sshpass


# Red Hat/Fedora/CentOS
$ sudo yum install sshpass


# Arch Linux
$ sudo pacman -S sshpass


#OS X
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

或从在这里下载源代码,然后

tar xvzf sshpass-1.08.tar.gz
cd sshpass-1.08.tar.gz
./configure
sudo make install

Solution2:设置SSH无密码登录

假设您需要从aaa@1.1.1.1(Client server A)使用密码2b2b2b SSH到bbb@2.2.2.2(Remote server B)

使用以下命令生成A中的public key(.ssh/id_rsa.pub)private key(.ssh/id_rsa)

ssh-keygen -t rsa
[Press enter key]
[Press enter key]
[Press enter key]

使用以下命令将生成的public key(.ssh/id_rsa.pub)以文件名authorized_keys的形式分发到服务器B的bbb的.ssh目录下

ssh-copy-id bbb@2.2.2.2

第一次ssh登录需要输入密码,以后会自动登录,不需要再次输入!

ssh bbb@2.2.2.2 [Enter]
2b2b2b

然后你的剧本就可以

#~/bin/myssh.sh
ssh myname@somehost