问题描述
我正在使用ubuntu 11.10。我每天都使用ssh连接到很多服务器,所以我把它们的参数放在.ssh/config
文件中;喜欢这个 :
1 2 3 4 |
HostHome User netmoon Port 22 HostName test.com |
对于每个连接,有没有办法将密码放在此文件中?因此,当服务器请求密码时,终端将其传递并发送到服务器。
这是因为有时候我会离开电脑,当我回去输入密码,然后按回车键,终端说CONNECTION CLOSED。
- 我不想使用公钥/私钥对。
最佳解决思路
为方便起见,安全交易永远不会结束……
你能用openssh-client
包中的ssh-copy-id
吗?
来自man ssh-copy-id
:
1 2 3 |
ssh-copy-id is a script that uses ssh to log into a remote machine and append the indicated identity file to that machine's ~/.ssh/authorized_keys file. |
次佳解决思路
如果您不想使用公钥/私钥对,可以编写expect
脚本,根据目标地址自动输入密码。
编辑:我的意思是你可以有一个脚本,一方面使用expect
为你输入密码,另一方面,从配置文件中读取给定用户和主机的密码。例如,以下python脚本将适用于晴天场景:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/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) |
配置文件格式如下:
1 2 3 4 5 6 7 |
[user_1] host1 = passwd_1 host2 = passwd_2 [user_2] host1 = passwd_1 host2 = passwd_2 |
注意:如上所述,python脚本需要更加复杂,以处理来自ssh和所有可能URL的所有可能错误和问题消息(在示例中,假设它将类似于user@host
,但用户部分不是大多数时候都没用过,但基本的想法仍然是一样的。注册配置文件,您可以使用不同的配置文件或使用.ssh/config
并编写自己的代码来解析该文件并获取给定用户和主机的密码。
第三种解决思路
还有sshpass
程序。使用方法:sshpass -p MyPa55word ssh me@myservor.com
第四种思路
不,我害怕这是不可能的。
唯一真正的选择是使用私钥,但你说你不想(为什么不呢?)。
第五种思路
ProxyCommand怎么样:
1 2 3 4 5 6 |
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
:
1 |
ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p |
第六种思路
您可以在/usr /local /bin中创建一个简单的ssh脚本替换:
1 2 3 4 5 6 7 8 9 10 |
#!/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文件中你可以使用
1 2 3 |
Host foohost User baruser #Password foobarpassword |
第七种思路
我使用VanDyke Software的一个名为SecureCRT的应用程序。
http://www.vandyke.com/products/securecrt/
它不是免费的,但价格非常合理。我已经使用它多年(在Windows上运行,或使用Wine)进行远程访问,终端仿真和(分散的)网络管理。他们最终在2011年初发布了本机Linux版本。
它支持复杂的登录设置(或脚本),存储的密码(或证书),标签式多个会话等。
在启动时,您可以从存储的远程(或本地)计算机的结构化列表(树视图)中选择哪个远程目标(和协议),或者只创建一个连接(然后存储)。
我发现它对具有高级身份验证,non-standard端口或firewall-access协商的远程站点特别有用。
如果您正在进行大量远程访问(主要角色的一部分),那么此应用程序将在使用的第一个月内证明其费用。
第八种思路
zsh + ssh 免密登录
1 |
echo “alias ssh-to-username=’ssh username@hostname’” >> ~/.zshrc |
将username和hostname替换为你的服务器信息
source ~/.zshrc 重新加载更改后的zshrc文件
ssh-to-username 使用别名
一条命令即可登录你的ssh服务器