有时我必须登录多个服务器并切换到root。
现在我的 ssh 配置看起来像这样
Host *
User xxx
Port 32200
Host hostnamexxx
HostName xxx.xxx.xxx.xxx
IdentityFile /root/.ssh/id_rsa
我可以更改本地 (ssh) 配置仅登录服务器并使用密码自动切换到 root 吗?
不过,将密码存储在未加密的文件中似乎是一种不太安全的方法。
答案1
您可以在 中以 root 身份登录,而不是在登录后“切换”到 root ssh
。
您可以将以下行添加到您的配置文件中User root
:
Host hostnamexxx
HostName xxx.xxx.xxx.xxx
User root
IdentityFile /root/.ssh/id_rsa
这意味着当您尝试ssh
访问 hostnamexxx 时,它将尝试直接以 root 身份登录。这相当于运行以下ssh
命令:
$ ssh -i /root/.ssh/id_rsa -l root hostnamexxx
但是,它将无法使用该文件,因为它受到保护并且只能由 root 读取,并且它将在目标主机上/root/.ssh/id_rsa
询问的密码。root
$ ssh -i /root/.ssh/id_rsa -l root hostnamexxx
Warning: Identity file /root/.ssh/id_rsa not accessible: Permission denied.
Password:
输入 的root
密码后,您将以 root 身份登录到目的地。
如果您不想提供密码,您可以将root
的身份文件从/root/.ssh/id_rsa
(当然假设您具有sudo
的权限root
)复制到您的主文件夹并将所有者更改为您的用户:
$ sudo cp /root/.ssh/id_rsa $HOME/.ssh/root_id_rsa && sudo chown <your username> $HOME/.ssh/root_id_rsa
然后$HOME/.ssh/root_id_rsa
用作IdentityFile
.
答案2
我发现expect
可以从这里处理这个问题和其他来源。
#!/usr/bin/expect
set HOSTNAME [lindex $argv 0]
spawn ssh -t $HOSTNAME su -
# expect "密码:"
log_user 0
send "xxxxx\r"
interact
如果您愿意,可以为此脚本设置一个别名。
alias sshr="/root/expect_ssh.sh"
该脚本与我的 ssh 配置配合良好,但可能需要根据您的命令进行一些更改spawn ssh
。
不幸的是,我对expect脚本知之甚少,上面的脚本有一些可能需要改进的地方。
expect "密码:"
不起作用,我将其更改为Password:
,Password:
。没用。- 我尝试使用
log_user 0
抑制发送的输出,当然是隐藏密码。但没有成功。