为.ssh / config添加密码


24

我正在使用Ubuntu 12.04。我每天都使用ssh连接到许多服务器,因此我将它们的参数放在.ssh / config文件中。像这样 :

Host server1
User tux
Port 2202
HostName xxx.x.xx.x

有没有一种方法可以为每个连接在该文件中放置密码?因此,当服务器要求输入密码时,终端会将其通行证发送给服务器,因此我不必每次都键入密码。另外,我不想使用公钥/私钥对。


10
这就是密钥对的用途。
迈克尔·汉普顿

Answers:


31

不,没有任何方法可以使用opensh内置机制以非交互方式在命令行上指定或提供密码以进行ssh身份验证。至少没有我所知道的。您可以将密码硬编码为Expect脚本,但这也不是一个好的解决方案。

正如迈克尔所说,您绝对希望使用密钥对进行无密码身份验证,最后私钥在文件中几乎是一个很大的密码。


问题是,它是我的客户端服务器,它们不允许使用密钥登录。我使用期望登录到存储凭据的所有服务器来编写bash脚本n从usb存储设备获取。谢谢
阿乔·奥古斯丁

1
很不安全。在该脚本中唯一建议使用严格的文件权限锁定该文件。
Danila Ladner 2013年

1
如果他们不允许使用密钥,则会误解ssh的工作原理-允许密码登录使您容易遭受字典攻击等(尽管速度非常慢)-几乎不可能用私钥对来完成同样的任务,如果它们担心密钥落入不正确的人手中,您可以使用密码对密钥的私有部分进行加密,这样您需要两个因素才能使用它(密码也可以在您的钥匙串中/由ssh代理记住。 )
Alex Berry

教育您的客户。向他们解释最好禁用密码身份验证,并且只允许相反的键。
Nikita Kipriyanov

20

为了避免评论串:是的,这是不安全的(甚至可以说不是不安全的)。我强烈建议您仅在实验室环境中的隔离网络上或在不涉及生产服务器或没有完全重置/格式的情况下不涉及生产服务器的类似情况下,执行此操作。

我想进行此设置,因为我认为我的2950交换机不支持私钥/公钥,并且希望在某个时候获得这些知识,但是我还没有。

使用别名和sshpass可以实现。

  1. 安装sshpass
  2. 更改您的.ssh / config文件,使其包含问题中列出的用户名
  3. 向您的终端添加别名(我使用.bashrc,建议不要使用gloabl设置)
  4. 使用别名登录到目标

我的示例别名是:

alias ssc='sshpass -pcisco ssh'

其中“ cisco”是密码。请注意,-p和密码之间没有空格。

用法是(引用问题):

ssc server1

注意:这仅针对使用搜索引擎的用户回答标题中的问题。如果您使用服务器(例如问题示例),则应使用私钥/公钥对而不是此答案


唯一可行的解​​决方法,当您无论出于何种原因都无法使用键时。
sjas

作品!太棒了
拉胡尔

我建议用完整的shell脚本替换别名;这将使您有机会根据主机参数动态选择要使用的密码文件。
7heo.tk

最好在-p和密码之间放置一个空格,这在cli程序中很常见……
masterxilo

10

是的,如上所述,无法简单地保存密码。我建议使用ssh密钥进行授权。

首先,生成您的密钥:

ssh-keygen

然后在服务器/台式机上复制密钥:

ssh-copy-id -i .ssh/id_rsa.pub user@ip-address:

就这样。永远不会再要求您输入密码。

我还建议您一般删除密码授权,但这取决于您。


1
感谢您参考ssh-copy-id!我曾经使用过一些类似的工具,sshpass -p $PASSWORD ssh $USERNAME@$HOST "echo `cat ~/.ssh/id_rsa` >> /home/$USERNAME/.ssh/authorized_keys"但是该程序更干净,使意图更清晰。
masterxilo

3

ssh无法做到这一点,因为它可能会变得不安全。

正如Danila提到的,您可以使用期望脚本,但我不会打扰。

我想知道您想达到什么目标?您要从一台服务器跳到另一台吗?在这种情况下,您要在工作站上设置和使用ssh-agent并在目标主机上启用代理转发;这样,凭据交换将被路由到您的本地代理,而不必复制您的私钥。


VisualStudio具有个人访问令牌的概念,就像应用程序专用的密码一样,此功能会有所帮助。
spuder

1

我从~/.local/bin目录使用此脚本

#!/usr/bin/bash

ORIG_SSH=/usr/bin/ssh
HOST=$1

SSHPASS=$(grep -Pzo "Host $HOST"'\s*\n((?!Host).*\n)*#PS\s(\N+)\n' ~/.ssh/config|tail -n 2|head -n 1 | sed 's/#PS //')
if [ -n $SSHPASS ]; then
    export SSHPASS
    sshpass -e $ORIG_SSH $@
else
    $ORIG_SSH $@
fi

这让我指定密码为#PS <password>.ssh/config文件中。

但是,正如大家说,这是更好地利用ssh-keysssh-agent当它是可能的


0

处理这种情况的正确方法是使用基于会话的ssh-agent。方法如下:

$ eval `ssh-agent`
$ ssh-add /home/user/.ssh/your_key
Enter passphrase for /home/user/.ssh/your_key:

密码将在其余会话中保持有效。您只需要运行一次第一个命令,然后就可以添加任意数量的键。当会话被杀死时,代理也会被杀死,因此不会存在密码的硬编码存储。

震惊了这么久之后,这个答案就没有了!


不存在的原因可能是发帖人专门说他不想使用公共/私有密钥对。
珍妮D说恢复莫妮卡

1
我错过了,谢谢。然后我要补充一点,对于SSH不使用密钥对是一个非常非常糟糕的主意。它更安全,更方便...我敦促OP重新考虑。使用没有密码短语的密钥对比没有密钥对和密码要安全得多。但是,理想情况下,如果他们在需要存储密码短语的会话中使用密码对,则可以使用我提供的步骤。
pranalli

-1

您可以使用sshpass以更安全的方式执行此操作

  1. 设置没有历史记录的密码

    export PS = your_password ; history -d $(历史1)

  2. 在〜/ .ssh / config中如上所述设置主机别名

  3. 使用ssh pass使用环境变量并在单个命令中登录所需的计算机

sshpass -p $ PS ssh host_alias

您的环境正在保存您的密码,如果您不知道自己在运行什么,那么执行的任何脚本都可能泄漏该密码,这是有风险的


不,那不安全。而且非常难看。
7heo.tk

那个“解决方案”难道不比问题长吗?所有这些额外的步骤,您仍然需要输入sshpass -p $PS ...
Dan H
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.