我正在尝试动态定义我的别名,但我必须做错事......
我有一个名为hosts.txt的文件。这是格式:
#shortname,host,account
h1,host1.somewhere.com,acc1
h2,host2.somewhere.com,acc1
h3,host3.somewhere.com,acc1
在我的bash_profile中我有以下代码
grep -v '^#' hosts.txt | while read line;do
DATA=(${line//,/ })
cmd="${DATA[0]}=\"ssh ${DATA[2]}@${DATA[1]}\""
eval $cmd
done
当我登录时,我希望看到我的别名定义如下
alias h1=ssh acc1@hos1
alias h2=ssh acc1@hos2
alias h3=ssh acc1@hos3
但我不知道如何实现这个目标?
恢复正确的方式: 别名不能使用while循环动态定义,因为它在子shell中运行,因此它定义的内容永远不会使我们成为父shell。这就是问题所在...... 一旦我移动了它的forloop就可以了。
答案 0 :(得分:2)
ssh
配置文件已经可以定义基本上与您尝试执行的操作相同的主机名别名。在~/.ssh/config
中,添加
Host h1
HostName host1.somewhere.com
User acc1
Host h2
HostName host2.somewhere.com
User acc1
Host h3
HostName host3.somewhere.com
User acc1
然后,您只需键入ssh h1
作为ssh acc1@host1.somewhere.com
的快捷方式即可。如果确实仍然需要更短的别名,只需将以下内容添加到.bash_profile
。
for h in h1 h2 h3; do
alias $h="ssh $h"
done
对于您只需要在两个配置文件中输入一次的内容,尝试进一步自动化并不值得。只是对它们进行硬编码。但是,如果你必须:
while read _ host; do
alias $host="ssh $host"
done < <(grep "Host " ~/.ssh/config)