如何使用密码自动进行SSH登录?

Eon*_*nil 592 automation ssh password

如何使用密码自动进行SSH登录?我正在配置我的测试虚拟机,所以没有考虑高安全性。选择 SSH 以获得可接受的安全性,且配置最少。

前任)

echo password | ssh id@server
Run Code Online (Sandbox Code Playgroud)

这不起作用。

我记得我是用一些技巧来做到这一点的,有人指导我,但我现在不记得我使用的技巧了......

wee*_*ens 752

$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
Run Code Online (Sandbox Code Playgroud)

  • 是的,有时由于各种原因您无法使用基于密钥的身份验证。 (65认同)
  • -1 必须在命令中使用密码。这会将密码以纯文本形式记录在您的机器上的 `.bash_history` 中。 (37认同)
  • 专业提示:如果您不想在 .bash_history 中显示特定命令,请在命令前添加一个空格。它只是有效。但是,该命令的用户应该更关心系统上的非特权用户可以使用 ps 看到完整的命令行,当然,其中包括密码。由于 ssh 会话往往是长期存在的,因此这是一个安全问题。 (36认同)
  • +1!作为旁注,您需要在使用 `sshpass` 之前运行一次普通的 `ssh`,以确认 RSA 指纹 (23认同)
  • @MisterDood 你可以在命令之后运行 `history -r` 来删除你的历史。不过好点。 (19认同)
  • @AlaskaWebHosting 为什么不只是`sshpass -p "$(cat ~/credentials/server01)" ssh user@server01`? (9认同)
  • 如果这是您第一次登录,您可以使用 `-oStrictHostKeyChecking=no` 跳过主机密钥检查。示例用法:`sshpass -p 'your_password' ssh -oStrictHostKeyChecking=no user@hostname uptime` (9认同)
  • +1 因为我不在乎它登录在`.bash_history` 中。任何。 (7认同)
  • 这是在 OSX 上安装 sshpass 的要点:https://gist.github.com/arunoda/7790979 (4认同)
  • `sshpass -p 'your_password' ssh user@hostname -p portnumber` 如果您的端口不同于 22 (4认同)
  • 我喜欢@yunzen 评论,您可以从文件或作为另一个命令的结果读取 $PASSWORD_SSH 变量,例如:`source .env; sshpass -p $PASSWORD_SSH ssh 用户@主机名` (4认同)
  • 只需使用`sshpass -f PWFILE ssh user@host` 直接从文件中获取密码 (3认同)
  • 试试像这样的`stty -echo; read -s -p "输入 ssh 密码:" PASSWORD_SSH; stty 回声; sshpass -py$PASSWORD_SSH ssh user@hostname;` 在 bash 脚本文件中,以便在 `.bash_history` 中没有密码 (2认同)
  • 这应该是公认的答案 (2认同)

Cak*_*mox 518

不要使用密码。生成无密码 SSH 密钥并将其推送到您的 VM。

如果你已经有一个 SSH 密钥,你可以跳过这一步……只需点击Enter密钥和两个密码:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
Run Code Online (Sandbox Code Playgroud)

将您的密钥复制到目标服务器:

$ ssh-copy-id id@server
id@server's password: 
Run Code Online (Sandbox Code Playgroud)

现在尝试登录机器,使用ssh 'id@server',并签入:

.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

以确保我们没有添加您不期望的额外密钥。

最后检查登录...

$ ssh id@server

id@server:~$ 
Run Code Online (Sandbox Code Playgroud)

ssh-agent如果您想尝试使用密码保护您的密钥,您可能还想考虑使用。

  • 这是一个很好的答案,但不是问题的正确答案。 (212认同)
  • 这些回答真的,真的让我很恼火。这不是问题。没有人问如何使用密钥对。 (144认同)
  • 这并没有回答这个问题。对于一个完全不同的问题,这是一个很好的答案,但对于被问到的人来说却很糟糕。 (48认同)
  • 我最终决定使用密钥对。因为我意识到这是最简单的方法。 (20认同)
  • 我们能不能集体努力停止用“不要那样做”来回答“如何做”的问题? (17认同)
  • @Eonil:不要试图使用没有密码短语的密钥。了解如何使用 ssh-agent 或 pageant。 (9认同)
  • 如果您的计算机没有`ssh-copy-id`,[此代码段](http://www.commandlinefu.com/commands/view/9379/copy-your-ssh-public-key-to-a- server-from-a-machine-that-doesnt-have-ssh-copy-id)(通过管道将密钥发送到`ssh`)是等效的。或者,在 Mac OS X 上,使用 [Homebrew](http://mxcl.github.com/homebrew/) 安装 `ssh-copy-id`:`brew install ssh-copy-id`。 (4认同)
  • 我和约翰亨特在一起。最佳实践,最适合通用用例,提问者对此很满意......绕过提问者的问题而不是解决问题的替代解决方案。可悲的是,并不是每个人都有幸能够做到这一点。我认为这个答案如果采用以下形式可能会好得多:“这是你如何做你所要求的:<da-da-da>……但是,如果你能避免这种情况,你应该,因为< do-do-do>,因为 <de-de-de> 更安全/最佳实践。” (4认同)
  • 此解决方案的一个问题 - 如果设备不支持无密码身份验证(例如许多 SAN 或专用硬件设备),则此方法将不起作用。 (3认同)
  • 这是对错误问题的正确答案...... (3认同)
  • `ssh-copy-id` 也不接受来自 STDIN 的密码。当您为了创建一个新的 su、上传它的公钥并限制登录到密钥和限制 root 登录而只需要登录一次时,上传 root 的公钥是没有意义的。 (2认同)
  • 嘿伙计,所有这些人都讨厌你回答问题并被接受,哈哈。这正是我一直在寻找的,至少有 422 个人也是如此,继续回答这样的问题,因为这是一个很好的答案。 (2认同)

lza*_*zap 99

虽然您的问题的正确答案是sshpass有关详细信息请参阅其他答案),但还有一种更安全的方法 - SSH 密钥。您离解决方案只有三个简单的步骤

以下所有命令都在客户端运行,即您的机器

输入以下命令开始生成rsa 密钥对

# ssh-keygen
Run Code Online (Sandbox Code Playgroud)

当出现“输入要保存密钥的文件”消息时,只需按 Enter 将文件名留空即可。

当终端要求您输入密码时,也只需将此留空并按 Enter。

然后使用一个简单的命令将密钥对复制到服务器上:

# ssh-copy-id userid@hostname
Run Code Online (Sandbox Code Playgroud)

您现在无需密码即可登录

# ssh userid@hostname
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的答案。 (44认同)
  • 和?答案在上面,sshpass... (4认同)
  • 使用默认值可以正常工作。尝试 `ssh-copy-id` 时,使用 ~/rsa4live.pub 对我不起作用。 (2认同)
  • 对我来说是`ssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host` (2认同)

oos*_*hro 54

使用期望:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact
Run Code Online (Sandbox Code Playgroud)

例子:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost
Run Code Online (Sandbox Code Playgroud)

  • 最好为 ssh 命令添加 `-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null` 以及避免将机器接受到 known_hosts (4认同)
  • 它有效,但无法打印远程机器的标准输出。 (2认同)

nro*_*ans 38

SSH 单点登录通常是通过公钥身份验证和身份验证代理来实现的。您可以轻松地将测试 VM 密钥添加到现有的身份验证代理(请参见下面的示例)。其他方法如 gssapi/kerberos 也存在,但更复杂。

sshpass

password唯一可用的身份验证方法的情况下,sshpass可用于自动输入密码。请特别注意手册页安全考虑部分。在所有三个选项中,密码在某些时候是可见的或以纯文本形式存储的

匿名管道(sshpass 推荐)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-
Run Code Online (Sandbox Code Playgroud)

它在 bash 中非常麻烦,可以说使用编程语言更容易。在写入密码之前,另一个进程可能会附加到您的管道/fd。机会之窗很短,仅限于您的进程或根。

环境变量

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host
Run Code Online (Sandbox Code Playgroud)

您和 root 可以在 sshpass 运行 ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=) 时读取您进程的环境变量(即您的密码)。机会之窗更长,但仍仅限于您自己的进程或 root,而不是其他用户。

命令行参数(最不安全)

 sshpass -p my_secret_password ssh user@host
Run Code Online (Sandbox Code Playgroud)

如手册页中所述,这很方便,但安全性较低。命令行参数对所有用户都是可见的(例如ps -ef | grep sshpass)。sshpass 试图隐藏参数,但仍然有一个窗口,在此期间所有用户都可以看到您通过参数传递的密码。

边注

将 bash HISTCONTROL 变量设置为ignorespaceorignoreboth并在敏感命令前加上空格。他们不会被载入史册。


SSH 公钥认证

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host
Run Code Online (Sandbox Code Playgroud)

密码非常重要。任何以某种方式获得私钥文件的人都无法在没有密码的情况下使用它。

设置 SSH 身份验证代理

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)
Run Code Online (Sandbox Code Playgroud)

像往常一样连接

ssh user@host
Run Code Online (Sandbox Code Playgroud)

优点是你的私钥是加密的,你只需要输入一次密码(也可以通过更安全的输入方法)。

  • 如果你真的忍不住回答“不要那样做”,*这*就是你应该做的!回答*实际问题*,然后在最后提出您主动提供的建议。干得好@nrolans。 (7认同)

ead*_*ter 31

我很惊讶没有人plinkputty-toolsUbuntu的软件包中提到:

plink user@domain -pw mypass  [cmd]
Run Code Online (Sandbox Code Playgroud)

它也可以在 Windows 上使用,并且语法大部分与 openssh 客户端兼容。

  • 它在`putty-tools`包中 (4认同)
  • 根据您的情况,这仍然非常不安全。命令行上的密码在进程列表中可见,并且可能由您的 shell 记录。 (3认同)
  • 对于 Windows,您的答案很好,不幸的是 linux/unix 用户通常没有 plink (2认同)

Jam*_*s L 19

这可能对您没有任何用处,但您可以使用 Perl 来完成:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";
Run Code Online (Sandbox Code Playgroud)

  • 同样,您可以使用此 Ruby https://github.com/net-ssh/net-ssh (3认同)

Coo*_*ops 7

确定您不想使用 SSH 密钥而不是密码吗?这样它既安全又自动。

  • 这不是一个答案。 (27认同)
  • @yunzen 不正确。即使您不知道主机密钥,密钥身份验证也可以保护您免受 mitm 攻击。攻击者可以模拟服务器,但永远不会连接到真实服务器。通过密码验证,您连接到的任何服务器(合法与否)都会看到密码。由于这些原因,没有密码的 ssh 密钥比仅将密码存储在文件中要安全得多。 (10认同)
  • 好吧,我会说接受的答案是对未提出的问题的体面答案。这不是什么。 (4认同)
  • 使用不带密码的 SSH 密钥仅比在文件中使用密码稍微安全一些。 (3认同)

Bad*_*ers 7

我更喜欢passh https://github.com/clarkwang/passh

sshpass 被设计破坏了。

当我的 ssh 服务器尚未添加时known_hostssshpass不会向我显示将服务器添加到我已知主机的消息,passh没有这个问题。

登录到远程服务器:

$ passh -p password ssh user@host
Run Code Online (Sandbox Code Playgroud)


Cam*_*err 6

根据您的自动化需求,Ansible 可能适合您。它可以很好地管理诸如提示输入密码、提示输入 sudo 密码、更改使用的各种方式、安全地使用加密的机密 (Vault) 等内容。

如果这不合适,我会建议使用 Expect,正如另一个答案中所建议的那样。

  • 使用 Ansible 进行简单的“ssh”自动化就像使用毛毛虫在尖塔上进行倒立。是的,[你可以做到](https://youtu.be/t5mn_upy-w8),但是.. (5认同)