我想设置一个别名,“默认”使用与我当前用户名不同的用户名。就像这样:
$ echo $USER # outputs kamil
$ alias myssh='ssh -o User=somebody' # non-working example of what I want to do
$ myssh server # Uses somebody@server - all fine!
$ myssh root@server # I want it to use root@server, but it does not. It connects to `somebody@server`!
# Easy testing:
$ myssh -v root@localhost |& grep -i 'Authenticating to'
debug1: Authenticating to localhost:22 as 'somebody'
# ^^^^^^^^ - I want root!
上面的代码不起作用 - 用户root@server
是被覆盖经过-o User=somebody
。我可以一起做一些事情:
myssh() {
# parse all ssh arguments -o -F etc.
if [[ ! "$server_to_connect_to" =~ @ ]]; then # if the use is not specified
# use a default username if not given
server_to_connect_to="somebody@$server_to_connect_to"
fi
ssh "${opts[@]}" "$server_to_connect_to" "${rest_of_opts[@]}"
}
但需要解析函数中的所有 ssh 参数以提取服务器名称,然后向其中添加用户名。解决方案是修改~/.ssh/config
和添加Host * User somebody
- 但是我在一台机器上没有对主目录的写访问权限(实际上根本没有主目录)并且我无法修改配置文件,而且我也不想覆盖正常ssh
操作。
是否有一个简单的解决方案来指定“默认可覆盖”用户连接到服务器而不进行修改~/.ssh/config
?
答案1
不要使用别名,只需配置您的 ssh 客户端。编辑(或创建,如果不存在)~/.ssh/config
并添加以下行:
Host rootServer
HostName server_to_connect_to
User root
Host userServer
HostName server_to_connect_to
User somebody
保存文件,您现在可以运行ssh rootServer
to connect asroot
和ssh userServer
to connect as somebody
。
答案2
也许您可以使用变量设置用户名,然后回退到默认值:
myssh() {
ssh -o "User=${user:-somebody}" "$@"
}
并像这样使用它:
myssh server # use default user
user=root myssh -v server # use root as the username
答案3
我可以生成一个临时文件并将该文件ssh
作为配置传递给它并-F
添加Host * User somebody
到其中。
myssh() {
(
# in a subshell, so that `trap` will not affect parent
local tmp
tmp=$(mktemp --tmpdir .cis-ssh-config.XXXXXXXXXXX)
trap 'rm "$tmp"' exit
{
printf "%s\n" "Host *" " User somebody"
# silence errors, if the files doesn't exists
cat /etc/ssh/ssh_config ~/.ssh/config 2>/dev/null ||true
} > "$tmp"
ssh -F "$tmp" "$@"
)
}