作为一个系统管理员,我经常将rdp和ssh放入远程机器进行管理。
我创建了一个文件$ {SERVER_FILE},每行包含一个条目,注意连接到给定服务器时要使用的主机名和协议。
示例:
...
server1,ssh
winsrv,rdp
...
鉴于以上条目,我希望创建+评估以下内容(rdp本身就是我系统上的脚本):
alias server1='ssh server1' winsrv='rdp winsrv'
以下代码,当我将结果输出剪切并粘贴到alias
命令时,可以完美地运行:
$ echo $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')
server1='ssh server1' winsrv='rdp winsrv'
$ alias server1='ssh server1' winsrv='rdp winsrv'
$ alias
alias server1='ssh server1'
alias winsrv='rdp winsrv'
所以我把它更改为实际导致创建别名并且我得到错误:
$ alias $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')
bash: alias: server1': not found
bash: alias: winsrv': not found
$ alias
alias server1=''\''ssh'
alias winsrv=''\''rdp'
么?
答案 0 :(得分:2)
尝试:
$ eval alias $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')
适合我。
答案 1 :(得分:1)
我可以建议使用awk而不是sed来获得更容易阅读的命令吗?
awk 'BEGIN { FS=","
format = "%s=\"%s %s\" " }
$2 ~ /(rdp|ssh)/ { printf format, $1, $2, $1 }' ${SERVER_FILE}
答案 2 :(得分:0)
好吧,看起来alias
和echo
正在以不同的方式解释一些反斜杠。这无疑是一个黑客,但我会尝试这个:
alias $(echo $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n'))
: - )