我正在使用Ubuntu 11.10和ssh
每天连接到许多服务器,所以我将它们的参数放在.ssh/config
文件中,像这样:
Host Home
User netmoon
Port 22
HostName test.com
有没有办法在这个文件中为每个连接设置密码,这样当服务器要求输入密码时,终端会自动输入密码并发送给服务器?
我需要这个功能是因为有时候我离开电脑一段时间,当我回来后,输入密码并按下Enter键时,终端会显示“连接已关闭”。
附言:我不想使用公钥/私钥对。
我正在使用Ubuntu 11.10和ssh
每天连接到许多服务器,所以我将它们的参数放在.ssh/config
文件中,像这样:
Host Home
User netmoon
Port 22
HostName test.com
UseKeychain yes
,结合本地密钥链管理器(例如macOS密钥链访问、GNOME密钥环/libsecret),意味着如果您已登录到本地机器,加密的密钥将自动解密,而无需提示您输入密钥的密码短语,但密钥仍然以加密形式存储在磁盘上。 - Jivan Palexpect
脚本,根据目标地址自动为您输入密码。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
user@host
,但大多数情况下不使用用户部分),但基本思想仍然是相同的。关于配置文件,您可以使用不同的配置文件或使用.ssh/config
并编写自己的代码来解析该文件并获取给定用户和主机的密码。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
-W
选项不会按预期工作。你有什么解决办法吗? - Toan Nguyentest.com
需要密码转移到了Home
需要密码。这有什么意义呢?有什么诀窍可以让它正常工作吗? - Martin Bramwell还有一个名为sshpass
的程序。
使用方法:
sshpass -p MyPa55word ssh me@myservor.com
sshpass
而不是sshpass
),否则您刚刚将密码("MyPa55word")存储在了您的shell历史文件中。 - waltinator.ssh/config
这样的位置没意见,为什么对shell历史记录有意见呢? - Darth Egregiousbrew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
即可。更多信息请参考:https://gist.github.com/arunoda/7790979 - Jacob Fordps -lf -C sshpass
命令将会捕获密码,除非sshpass
清除了它的环境。 - waltinator export SSHPASS='YourPass'; sshpass -e ssh me@server
- ThiagoAlves不行,恐怕这是不可能的。
唯一的真正选择是使用私钥,但您说您不想使用(为什么?)。
#!/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
Host foohost
User baruser
#Password foobarpassword
CONNECTION CLOSED
”,那么为什么不防止会话关闭呢?SSH可以为你保持连接。Host Home
User netmoon
Port 22
HostName test.com
ServerAliveInterval 300
ServerAliveCountMax 2
我使用 VanDyke Software 开发的应用程序,名为 SecureCRT。
http://www.vandyke.com/products/securecrt/
这个软件不是免费的,但价格非常合理。我已经使用它多年了(在Windows上运行,或者使用Wine),用于远程访问、终端仿真和分散式网络管理。他们在2011年初终于发布了一个原生的Linux版本。debug1: /home/misty/.ssh/config line 42: Applying options for XXXXXX
的行。但是ssh输出的errlog带有\r,因此在传递给grep之前我们将其替换。#!/usr/bin/env bash
ORISSH=/usr/bin/ssh
ssh_dryrun=$($ORISSH -v -o "ProxyCommand=FAKE_PROXY_STUB %h %p" "$@" 2>&1 | sed -e 's/\r/\n/g')
host=$( grep -oP 'Applying options for \K(.*?)$' <<< $ssh_dryrun | head -n 1 )
if [[ $host == "*" ]]; then
password=''
else
password=`awk "/#Password/ && inhost { print \\\$2 } /^Host/ { inhost=0 } /Host $host$/ { inhost=1 }" ~/.ssh/config`
fi
if [[ -z "$password" ]]; then
$ORISSH "$@"
else
sshpass -p $password $ORISSH "$@"
fi
#!/usr/bin/env bash
ORISCP=/usr/bin/scp
scp_dryrun=$($ORISCP -v -o "ProxyCommand=proxyhost %h %p" "$@" 2>&1 | sed -e 's/\r/\n/g')
host=$( grep -oP 'Applying options for \K(.*?)$' <<< $scp_dryrun | head -n 1 )
if [[ $host == "*" ]]; then
password=""
else
password=`awk "/#Password/ && inhost { print \\\$2 } /^Host/ { inhost=0 } /Host $host$/ { inhost=1 }" ~/.ssh/config`
fi
if [[ -z "$password" ]]; then
$ORISCP "$@"
else
sshpass -p $password $ORISCP "$@"
fi
# 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
,则会覆盖#Password
。
$MYPASS_ENVVAR
是保存密码的环境变量。function scp(){
host=$(echo $* | perl -pe 's/^.*?([A-Za-z-1-9-]+):.*?$/\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.d/*)
if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
#echo /usr/bin/scp -3 $*
/usr/bin/scp -3 $* || true
#echo "SSH Exit Code $?"
else
if [[ -n "$PASSVAR" ]]; then
#PASSWORD=`echo ${!PASSVAR}`
PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
fi
#echo /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/scp -3 $*
/usr/bin/sshpass -p"$PASSWORD" /usr/bin/scp -3 $* || true
#echo "SSHPass Exit Code $?"
fi
}