用于登录SSH服务器的Shell脚本


29

我尝试编写一个shell脚本,该脚本可以使用脚本中提到的密码自动登录ssh服务器。我写了以下代码:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

此代码无法正常运行,但仍在要求输入密码。有人可以帮我解决这个问题吗



Answers:


36

我曾经写过一个expect脚本来登录ssh服务器(如您的情况),而我的脚本是这样的:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

我认为interact您的脚本中可能缺少。


这对我来说绝对是很好的工作,我被困在这个地方,交互为交互终端提供了提示,但是我正在尝试自动执行更多的步骤,例如do cdand,ls以及读取文件的内容。互动之后可以做吗?请回复
Hansiemithun '18

@Hansie,您可以ls在登录后发送命令。例如,在发送密码后,expect对命令提示符文本进行确认(以确保您已登录),然后按send "ls\r"。所有这些都过去了interact
saeedn

这个问题有点不正确,对不起,做ls和阅读内容后,我能够打印相同的。但是如何将其从ssh会话中获取到变量以从本地计算机访问。参考:stackoverflow.com/questions/32341234/expect-script-return-value。但是输出对我不起作用。我的问题发布了:stackoverflow.com/questions/51628465/…。我需要file_list退出后才能从本地命令提示符下访问
Hansiemithun

31

您正在以错误的方式进行操作。您要做的是生成一个无密码的ssh-key对,然后(只要服务器支持RSA密钥身份验证)就可以进入,而不必为所有密码输入密码。如果您的私钥存储在可能被盗的地方,则存在安全风险。

跟着这些步骤:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Return提示输入密码时按
  5. 再按Return一次确认。

现在,~/.ssh目录中将有两个文件,mysshkey.pubmysshkeymysshkey.pub是您的公开密钥,可以安全地放在远程服务器上。mysshkey是您的无密码私钥,放在远程服务器上(或其他人可以得到副本的地方)并不安全。

在服务器上,您希望SSH进入:

  1. 登录到远程服务器
  2. mkdir -p ~/.ssh
  3. 复制的内容并将其粘贴mysshkey.pub~/.ssh/authorized_keys
  4. 确保~/.ssh/authorized_keys就是chmod“d到600

现在,要使其在本地计算机上生效,请运行以下命令:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

并且您将登录,而不会提示您输入密码。

这是管理自动登录的一种更可取的方法,因为您不必最终对多个位置进行硬编码(如果您更改了它,则需要更新)。


2
我会使用RSA密钥而不是DSA。但是除此之外,完全同意。
glglgl 2012年

12
有时您无法将密钥添加到远程主机,例如网络设备。
DarkHeart '16

1
我试过了 ssh仍然要求输入密码。您是否特别需要提供IP地址?我尝试同时使用<user> @ <domain-name>和仅域名。
Jay Bienvenu

这个命令说的参数太多了?(第3步)
约瑟夫·阿斯特拉罕

我必须更改为ssh-keygen -t dsa并手动输入文件位置。
约瑟夫·阿斯特拉罕

20

在基于Debian的发行版中,该sshpass软件包提供了一种更轻松的方式来执行所需的操作。该软件包可用于许多其他流行的发行版。您需要先进行设置:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

然后从如下脚本中调用SSH命令:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

与使用的解决方案相比,这提供了更大的灵活性,例如,如果您使用其他语言环境或需要更改密码expect


7

首先安装sshPass sudo apt-get install sshpass

然后在.bashrc文件中创建别名为

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

现在,通过重新加载更改的.bashrc文件 source ~/.bashrc

现在完成。

现在,您可以sshLogin在终端中使用上面创建的别名来运行ssh 。



2

创建散列密钥并将其保存在PC上所需的全部功能

只需输入

ssh-keygen -t rsa -b 4096 # just press Enter till the end

然后输入

ssh-copy-id <user>@<server>

然后使用正常登录

ssh <user>@<server>

现在您不需要密码了

注意:以纯文本格式保存密码很危险

此方法使用具有安全长度的公共密钥RSA的RSA创建密码的哈希值。


1
这似乎是该答案的重复。
roaima

#roaima是的,但是它总是建议一个非常有用的ssh-copy-id命令,其他人都没有提到。我为此赞成。
Huw Walters

1

只需5个简单步骤,即可使用SSH Keygen进行SSH无密码登录

环境设置: 在此处输入图片说明

步骤1: 启用S​​SH-Kegen密钥–(192.168.0.12)
首先使用用户登录服务器192.168.0.12,并使用以下命令生成一对公共密钥。

在此处输入图片说明

步骤2: 在– 192.168.0.11
上创建.ssh目录。使用以下命令,使用服务器192.168.0.12上的SSH连接服务器192.168.0.11在其下创建.ssh目录。

在此处输入图片说明

步骤3:将 生成的公共密钥上传到– 192.168.0.11
从服务器192.168.0.12使用SSH,并在用户.ssh目录下的服务器192.168.0.11上将新生成的公共密钥(id_rsa.pub)作为文件名authorized_keys 上传。

在此处输入图片说明

步骤4: 在192.168.0.11上设置权限
由于服务器上的SSH版本不同,我们需要在.ssh目录和authorized_keys文件上设置权限。

在此处输入图片说明

步骤5: 从192.168.0.12登录到192.168.0.11没有密码的服务器
从现在开始,我们可以以sheena用户身份从192.168.0.12服务器以tecmint用户身份登录到192.168.0.11,而没有密码。

在此处输入图片说明


谢谢...这对我有用,除了在第4步中,我得到了戏剧性的“警告”:“未保护的私钥文件!... ... /。ssh / id_rsa'太开放了。忽略...权限错误”。我chmod 700 id_rsa在本地服务器(客户端,即您的示例中为192.168.0.12)的目录.ssh中进行了操作:问题已解决
Mike啮齿动物


1

如其他答案中所述,我也使用sshpass但将其与read命令结合使用以将密码存储在临时环境变量中。这样,我的密码就永远不会写在任何地方。这是我使用的单行命令:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

之后,您必须输入密码(屏幕上不显示任何内容),然后按Enter键将打开连接。


0

我最近做了这个,这可能对您有帮助:

sshpass -p 'password' username@ipaddress

如果这不起作用,则必须在要连接的另一台计算机上生成密钥

ssh-keygen

它会生成私钥和公钥,并询问您要放置的位置,将其保留为空,默认情况下会将密钥保存在.ssh文件夹中,并询问您的密码短语,也可以将其保留为空,然后转到.ssh文件夹并更改公钥名称为“ authorized_keys”

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

这会将用户添加到列表中,然后转到主目录并授予权限并重新启动sshd服务

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

现在,您将必须将私钥从您要运行ssh命令的位置移至该系统,然后才能与

sshpass -p 'password' ssh -i id_rsa username@ip

如果即使不起作用,也可以使用vim编辑器在/ etc / ssh中打开sshd_config,检查pubkeyAuthenticatoin是否设置为yes,如果不将其更改为yes,请重新启动sshd服务,然后尝试使用它,肯定可以。


0

第一个参数是主机名,第二个参数是密码。

     #!/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

执行:./ script.expect

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.