您可以在.ssh / config中设置密码以允许自动登录吗?


93

我正在使用Ubuntu 11.10。我ssh每天都用于连接许多服务器,因此我将它们的参数放在.ssh/config文件中,如下所示:

Host Home
User netmoon
Port 22
HostName test.com

有没有一种方法可以在此文件中为每个连接放置密码,以便在服务器要求输入密码时,终端输入密码并将其发送给服务器?

我需要这样做,因为有时我会离开PC,回去时,键入密码,然后按Enter终端上的CONNECTION CLOSED

PS我不想使用公钥/私钥对。


1
我处于相同的情况,我无法上传我的公钥,因为我仅对svn具有ssh访问权限。那就是如果我尝试ssh svnhost我得到“((成功(2 2()(编辑管道svndiff1缺席提交commit-revprops深度log-revprops部分重放))))” svnserve响应而不是shell
Uberto

Answers:


56

为了方便而牺牲安全性永远不会完结...

您可以ssh-copy-idopenssh-client包装中使用吗?

来自man ssh-copy-id

ssh-copy-id是一个脚本,该脚本使用ssh登录到远程计算机,并将指示的标识文件附加到该计算机的〜/ .ssh / authorized_keys文件中。


12
如果远程管理员坚持禁用公钥授权,则此方法将不起作用...
tomasz 2014年

2
是的,但是在您的整个直接监督和控制下在系统上切合实际并不意味着妥协。例如,在一个无源的虚拟机上,没有外部连接仅用于单一用途的开发目的。
斯科特

36
毫无理由地坚持严格的安全措施也永远不会圆满结束。
cwallenpoole 2014年

6
有时结局很好。
devth 2015年

3
恕我直言,坚持使用密码进行身份验证比没有风险更大。我经常设置常用的ssh密码作为环境变量,因为我不愿意记住一组任意字符串。通过要求用户输入,仅是要求他们存储不佳。
eggmatters

26

如果您真的不想使用公钥/私钥对,则可以编写expect脚本以根据目标地址自动输入密码。

编辑:我的意思是,您可以拥有一个脚本,一方面,该脚本expect用于为您输入密码,另一方面,该脚本从配置文件中读取给定用户和主机的密码。例如,以下python脚本适用于晴天情况:

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

并且配置文件格式如下:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

注意:如前所述,python脚本需要更复杂才能处理ssh和所有可能的URL中的所有可能的错误和问题消息(在本示例中,假设它类似于user@host,但用户部分是'大部分时间都用过),但基本思想仍然相同。关于配置文件,您可以使用其他配置文件,也可以使用.ssh/config并编写自己的代码来解析该文件并获取给定用户和主机的密码。


你能进一步解释吗?
Netmoon 2011年

@Netmoon我为我的回答更清晰地添加了一个小示例。
jcollado 2011年

这没有回答如何将密码放入.ssh / config文件的问题
Eric Woodruff

1
实际上,它不能回答这个问题。但这解决了问题:避免手动输入密码并将其存储在文件中。这是OP所需要的。
Arcesilas

19

也有sshpass用于该程序。如何使用: sshpass -p MyPa55word ssh me@myservor.com


29
除非您在命令前加一个空格(sshpass而不是sshpass),否则您只是将密码(“ MyPa55word”)存储在Shell的历史记录文件中。
waltinator

1
@waltinator好点
igor

3
好吧.ssh/config,问问问题是否存在,为什么不在shell历史中呢?
Darth Egregious

它不是Homebrew上的正式版本,但您可以使用来从第三方存储库进行安装brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb。更多:gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com。这将阻止密码显示在历史记录中
Alexander Bird

19

ProxyCommand怎么样:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

您也可以使用ssh -W代替nc

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

使用-Woption时,它将无法按预期工作。您有什么解决方法吗?
Toan Nguyen'5

2
它仍然要求我使用此代理命令输入密码...
Victor Piousbox

1
我还发现它仍然要求输入密码。似乎所有这些都是将问题从test.com要求密码转移到Home要求密码。重点是什么?使它起作用的诀窍是什么?
Martin Bramwell

15

不,这恐怕是不可能的。

唯一真正的选择是使用私钥,但您已经说过不想(为什么不这样做)。


7
因为我没有权限在服务器上放另一个密钥。
Netmoon

2
@Netmoon:如果可以登录,则可以添加密钥,对吗?除非sysadmin进行了奇怪的设置,否则您只需要对主目录的写权限。
Scott Severance

4
@ScottSeverance我认为这是此问题所指的情况。无法添加密钥。是的,这很奇怪,但它经常发生。
user239558 2013年

5
我曾在共享主机环境中遇到过非常普遍的经验,在这些环境中,公钥访问被禁用,因此即使您可以添加密钥,也不会使用它们。这是有道理的,但这是许多托管服务提供商设置服务器的方式
billynoah 2014年

1
有答案表明这是可能的
埃里克·伍德拉夫

8

您可以在/ usr / local / bin中创建一个简单的ssh脚本替换:

#!/bin/bash

host=$1
password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

然后可以在〜/ .ssh / config文件中使用

Host foohost
    User baruser
    #Password foobarpassword

4

我使用VanDyke软件提供的名为SecureCRT的应用程序。

http://www.vandyke.com/products/securecrt/

它不是免费的,但价格非常合理。我已经使用它多年(在Windows上运行或使用Wine)进行远程访问,终端仿真和(分散的)网络管理。他们终于在2011年初发布了本机Linux版本。

它支持复杂的登录设置(或脚本),存储的密码(或证书),选项卡式多个会话等。

在启动时,您可以从存储的远程(或本地)计算机的结构化列表(树形视图)中选择哪个远程目标(和协议),或者仅创建一个连接(然后将其存储)。

我发现它对于具有高级身份验证,非标准端口或防火墙访问协商的远程站点特别有用。

如果您要进行大量远程访问(主要角色的一部分),则此应用程序将在使用的第一个月证明其费用合理。


对不起,我听不懂。你可以解释吗 ?
Netmoon 2011年

1
为您改写了词..
david6

2
自发布上述响应以来,SecureCRT已进行了多次迭代,包括2013年12月上旬发布的最新VanDyke。每次迭代都在改进程序,使其更具通用性。它还具有丰富的API,允许使用Python / VB脚本控制/接口程序。十年来,SecureCRT一直是我的核心工具包的一部分,我强烈推荐它。
Ville

同意 我继续对每个新版本进行Beta测试,并大量参与了移植到Ubuntu的早期测试。
david6

2

回答您提出的问题,不,不可能在ssh配置文件中配置默认​​密码。

但是,如果确实如您所说,那是“因为有时我会离开PC,然后回去时,键入密码并按Enter终端上的CONNECTION CLOSED“”,那么为什么不阻止关闭会话呢?SSH可以为您保持连接状态。

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2

1

谢谢Arek的启发...

与其运行另一个shell进程,不如说它只是在当前bash shell中运行的函数。它运行一个awk命令来解析配置文件,并找出它是否应该从一个shell变量或从密码明文写入到SSH配置文件需要密码(与awkeval而不是describe由于我打了使用问题describe)。

我尝试了许多使用ProxyCommand sshpass直接在ssh配置文件中使用的方法,但是似乎没有任何效果,除非可以通过RSA登录到框。但是随后我需要发送密码来打开我的加密目录。但是,下面的函数似乎在所有情况下都适用,即使对于Cygwin。

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

然后,一个~/.ssh/config部分如下所示:

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

如果 #Passvar config部分中存在,则会覆盖 #Password
$MYPASS_ENVVAR是保存您的密码的环境变量。

请享用!


1

@BrunoPereira 对此问题的答案显示了一种无需显式输入密码且避免使用ssh密钥的连接方法。

您可以在其中创建脚本,别名或函数~/.bashrc来快速执行该命令。

显然,使用此方法应考虑安全性。


链接到解决方案非常好-但是,继续在此处发布解决方案也是一种好习惯。这样,如果链接曾经被删除(偶尔发生在堆栈交换中),这里仍然有可用的答案。
保罗

0

这是我对@ArekBurdach答案的详尽阐述。它提供以下扩展:

  • 所述主机可以是在任何地方的ssh命令行; 即它也支持ssh <args> <host> <commands>语法
  • 不会硬编码到的路径 ssh
  • 更强大的解析 ssh_config
  • 奖励:包装器scp,太

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

安装

在您的中定义别名~/.bashrc

alias ssh=ssh-wrapper
alias scp=scp-wrapper

组态

使用该IgnoreUnknown指令时,ssh不会抱怨新引入的Password指令,因此(与@ArekBurdach的答案相反),我们可以使该指令显示为“真实”配置。如果您不喜欢这样,将脚本改回注释掉的脚本很简单。

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword

0

如果您没有直接访问密钥对的权限,则可以在本地计算机上加密密码。

做到这一点的方法是,除了使用@Eric Woodruff的ProxyCommand之外,还使用密钥对密码加密

一种组合方式是使用管道:

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

哪里

Host real-destination
    Hostname test.com
    User netmoon

0

博客中介绍了一种有关如何使用的方法的细微变化sshpass ,可以在此处找到。假设您有一个gpg加密密码(博客中对密码的描述方式)文件,则可以执行以下操作:

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

并将该命令另存为别名 .bashrc

如果您想通过该连接建立隧道,则可以执行以下操作

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
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.