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

Net*_*oon 107 ssh command-line bash remote-access

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

Host Home
User netmoon
Port 22
HostName test.com
Run Code Online (Sandbox Code Playgroud)

有没有办法将每个连接的密码放在这个文件中,这样,当服务器要求输入密码时,终端输入其密码并将其发送到服务器?

我需要这个,因为有时我远离电脑,当我回去时,输入密码并按Enter终端说CONNECTION CLOSED

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

wal*_*tor 58

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

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

来自man ssh-copy-id

ssh-copy-id 是一个脚本,它使用 ssh 登录到远程机器并将指定的身份文件附加到该机器的 ~/.ssh/authorized_keys 文件中。

  • 无缘无故地坚持严格的安全措施也永远不会有好结果。 (43认同)
  • 如果远程管理员坚持禁用公钥授权,这将不起作用... (13认同)
  • 有时结局很好。 (9认同)
  • 恕我直言,坚持使用密码进行身份验证的风险更大。我经常将 ssh 常用的密码设置为环境变量,因为我不愿意记住一组任意字符串。要求用户输入它们只是要求它们存储不当。 (4认同)
  • 是的,但是在您的整个直接监督和控制下对系统保持现实并不是妥协。例如,在一个没有外部连接的流浪虚拟机上,仅用于单个席位上的开发目的。 (3认同)
  • 我很确定我读过“我不想使用公钥/私钥对。”,但不知道在哪里......所以:“我不想使用公钥/私钥对。 ” => 好的,你为什么不使用公钥/私钥对? (2认同)

jco*_*ado 27

如果您真的不想使用公钥/私钥对,您可以编写一个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)
Run Code Online (Sandbox Code Playgroud)

配置文件格式如下:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*uff 23

ProxyCommand 怎么样:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p
Run Code Online (Sandbox Code Playgroud)

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

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p
Run Code Online (Sandbox Code Playgroud)

  • 它仍然要求我使用此代理命令输入密码... (3认同)

小智 20

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

  • 除非你在命令前加一个空格(`sshpass` 而不是 `sshpass`),你就已经在你的 shell 的历史文件中存储了你的密码(“MyPa55word”)。 (30认同)
  • 好吧,提问者在`.ssh/config`中很好,为什么不在shell历史中呢? (3认同)

Cae*_*ium 16

不,这恐怕是不可能的。

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

  • 因为我无权在服务器上放置另一个密钥。 (10认同)
  • 我在共享托管环境中拥有非常普遍的经验,其中公共密钥访问被禁用,因此即使您可以添加密钥,也不会使用它们。是的,这是有道理的,但这是许多托管服务提供商设置服务器的方式 (5认同)
  • @ScottSeverance 我认为这就是这个问题所指的情况。无法添加密钥。是的,这很奇怪,但经常发生。 (4认同)
  • @Netmoon:可以登录的话,可以加个key吧?您只需要对您的主目录进行写访问,除非系统管理员进行了奇怪的设置。 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

然后在你的 ~/.ssh/config 文件中你可以使用

Host foohost
    User baruser
    #Password foobarpassword
Run Code Online (Sandbox Code Playgroud)