我正在配置我的测试VM,因此不考虑严格的安全性。选择SSH可以通过最少的配置获得可接受的安全性。
ex)
echo password | ssh id@server
这不起作用。
我记得我是用一些指导我的技巧来做到这一点的,但是现在我不记得我曾经使用过的技巧了...
#1 楼
不要使用密码。生成无密码的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.
将密钥复制到目标服务器:
$ ssh-copy-id id@server
id@server's password:
现在尝试使用
ssh 'id@server'
登录到计算机,并签入:.ssh/authorized_keys
,以确保我们没有添加您不期望的额外密钥。
最后检查登录…
$ ssh id@server
id@server:~$
如果您想尝试使用密码保护密钥,您可能还想使用
ssh-agent
。评论
我最终决定使用密钥对。因为我意识到这是最简单的方法。
– Eonil
2011年3月1日12:49
@Eonil:不要试图使用没有密码短语的键。了解如何使用ssh-agent或选美。
–user9517
2011年3月1日13:20
这是一个很好的答案,但不是对该问题的正确答案。
–约翰·亨特
13年7月4日在13:34
这些答案真的让我很烦。那不是问题。没有人问如何使用密钥对。
–马特·弗莱彻(Matt Fletcher)
16年6月16日在12:41
这不能回答问题。对于一个完全不同的问题,这是一个很好的答案,但是对于一个被问到的问题来说,这是可怕的。
– srchulo
17年1月4日在20:42
#2 楼
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
评论
是的,有时出于各种原因您不能使用基于密钥的身份验证。例如,现在我不能在plesk服务器上使用keyauth,因为开箱即用它没有启用,而且我没有root用户。
–约翰·亨特
13年7月4日在13:33
+1!附带说明,在使用sshpass之前,您需要运行一次纯ssh,以确认RSA指纹
–user123444555621
13年8月2日在8:08
-1,表示必须在命令中使用密码。这会将密码以纯文本格式记录在.bash_history上。
–user164495
14年4月11日在21:18
@MisterDood您可以在命令后运行history -r来删除您的历史记录。好点。
– NuclearPeon
15年5月14日在18:37
专家提示:如果您不想在.bash_history中显示特定命令,请在命令前加上空格。它就是有效的。但是,此命令的用户应该更加担心,系统上的非特权用户可以看到带有ps的完整命令行,其中当然包括密码。由于ssh会话通常是长期存在的,因此这是一个安全问题。
– CubicleSoft
16年7月16日在15:47
#3 楼
虽然您问题的正确答案是sshpass(有关详细信息,请参见其他答案),但是还有一种更安全的方法-SSH密钥。您距离解决方案仅三步之遥:以下所有命令都在客户端运行,即您的机器
输入以下命令以开始生成rsa密钥对:
# ssh-keygen
当出现消息“输入要保存密钥的文件”时,只需按Enter即可将文件名保留为空白。
当终端要求您输入密码时,也将其保留为空白并按Enter 。
,然后使用一个简单的命令将密钥对复制到服务器上:
# ssh-copy-id userid@hostname
您现在无需密码即可登录:
# ssh userid@hostname
评论
使用默认值可以正常工作。尝试ssh-copy-id时,使用〜/ rsa4live.pub对我不起作用。
– Cees Timmerman
2015年6月4日上午10:08
如果您希望此步骤适用于其他用户,请执行以下操作:1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
– Venfah Nazir
16 Jun 17'在10:23
对我来说是ssh-copy-id -i〜/ .ssh / tatu-key-ecdsa user @ host
–加百利博览会
17年9月8日在21:47
这不是问题的答案。
–史蒂夫·贝内特(Steve Bennett)
17年11月27日在23:10
和?答案在上面,sshpass ...
–lzap
17年11月30日在16:21
#4 楼
使用期望值:#!/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
示例:
# ./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
评论
它可以工作,但是无法打印远程计算机的标准输出。
– Eonil
2011年3月1日12:41
它适用于某些机器,因为每次更改IP地址都无法预先输入密钥。
– Larrycai
2012年12月19日下午6:14
最好为ssh命令添加-oStrictHostKeyChecking = no -oUserKnownHostsFile = / dev / null以避免将计算机接收到known_hosts
– Larrycai
2012年12月19日下午6:15
B..b但是muh ssh键...
– Damien Bezborodow
17年6月1日在5:50
您可以在以下位置找到此脚本的更多详细示例:linuxaria.com/howto/…这里的示例也应适用于远程命令
– Radon8472
18年7月11日在13:39
#5 楼
我很惊讶没有人提到Ubuntu中的plink
软件包中的putty-tools
:评论
对于Windows,您的回答是好的,不幸的是linux / unix用户通常没有plink
– Radon8472
18年7月11日在13:48
它在腻子工具包中
–管理员
18年9月14日在16:14
根据您的情况,这仍然是非常不安全的。命令行上的密码在进程列表中可见,并且可能由您的Shell记录。
–antiduh
19-10-30在21:29
确保它是不安全的,顺便说一句,没有什么可以阻止您从存储中读取KDE电子钱包(或GNOME密钥环)或其他密码管理器中的密码。
–管理员
5月8日15:57
#6 楼
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>&-
它bash非常麻烦,可以说是编程语言更容易。在写入密码之前,可能会在您的pipe / fd上附加另一个过程。机会之窗很短,并且仅限于您的进程或root。
环境变量
# Set your password in an environment variable
export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host
您和root都可以读取您的进程' sshpass运行时的环境变量(即您的密码)(
cat /proc/<pid>/environ | tr 'ps -ef | grep sshpass
' '\n' | grep ^SSHPASS=
)。机会的窗口更长,但仍然仅限于您自己的进程或root用户,而不是其他用户。命令行参数(最不安全)
sshpass -p my_secret_password ssh user@host
如手册页所述,这很方便,但安全性较低。命令行参数对所有用户可见(例如
ignorespace
)。 sshpass尝试隐藏参数,但是仍然存在一个窗口,在此窗口中,所有用户都可以看到由参数传递的密码。边注
将bash的HISTCONTROL变量设置为
ignoreboth
或q4312079q,并在敏感命令前加上空格。它们不会保存在历史记录中。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
密码短语非常重要。没有密码短语的任何人以某种方式获取私钥文件都将无法使用它。
设置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)
照常连接
ssh user@host
优点是您的私钥已加密,您只需输入一次密码即可(通过输入法也更安全)。
评论
如果您真的无法拒绝回答“不要这样做”,这就是您应该这样做的方式!回答实际问题,最后提出您不请自来的建议。干得好@nrolans。
– Timmmm
19/12/18在10:59
#7 楼
这可能对您没有任何用处,但是您可以使用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! $!";
评论
同样,您可以使用此Ruby github.com/net-ssh/net-ssh
– EnabrenTane
2013年6月17日23:47
#8 楼
确定不想使用SSH密钥而不是密码吗?这样既安全又自动。评论
使用不带密码的SSH密钥仅比在文件中使用密码稍微安全。
– yunzen
15年4月14日在7:34
@yunzen不正确。密钥身份验证即使您不知道主机密钥,也可以保护您免受mitm攻击。攻击者可以模拟服务器,但从不连接到真实服务器。使用密码身份验证,您连接到的任何服务器(合法与否)都将看到密码。由于这些原因,没有密码的ssh密钥比仅将密码存储在文件中要安全得多。
–卡巴斯德
16年5月17日在7:15
这不是答案。
–史蒂夫·贝内特(Steve Bennett)
17年11月27日在23:10
@SteveBennett与接受的答案相同,并且在其之前发布,尽管它的细节较少。
–迈克尔·汉普顿
18年8月4日在14:34
好吧,我想说被接受的答案是对未提出问题的一个体面的答案。没什么
–史蒂夫·贝内特(Steve Bennett)
18年8月6日在6:24
#9 楼
根据您的自动化需求,Ansible可能会很适合您。它可以很好地管理诸如提示输入密码,提示输入sudo密码,各种更改使用方式,安全地使用加密机密(文件库)之类的事情。另一个答案。#10 楼
我更喜欢passh
https://github.com/clarkwang/passh sshpass被设计破坏了。
当我的
known_hosts
中尚未添加ssh服务器时,sshpass
会不向我显示将服务器添加到我的已知主机的消息,passh
没有此问题。登录到远程服务器:
$ passh -p password ssh user@host
评论
FreeBSD不接受无密码密钥。别动心。但是,某些Linux服务器接受了它。我相信Linux服务器配置错误。这是一个有效的问题。例如,我要允许用户输入密码,然后使用该密码登录到另一台计算机。我不能假设在我们所有的机器上都会分布ssh密钥。到目前为止,下面的答案对这种情况没有帮助。
unix.stackexchange.com/questions/38737/…|| unix.stackexchange.com/questions/38737/…|| stackoverflow.com/questions/233217/pass-password-to-su-sudo-ssh
非常重要的问题。我也需要一个答案,我的Webspace提供程序会阻止将密钥文件放置在服务器上,因此我必须传递不包含密钥文件的密码。
这是一个纯粹的bash答案,---文件开始---#!/ bin / bash [[$ 1 =〜password:]] && cat || SSH_ASKPASS =“ $ 0” DISPLAY =没什么:0 exec setsid“ $ @” ---文件结尾---将其保存为pass,执行chmod + x pass,然后像这样使用它:$ echo mypass | ./pass ssh user @ host