2011-09-23 60 views
1

以sysadmin我經常RDP和SSH進入遠程管理機器的bash別名。創建通過的.bashrc

我已經創建了一個文件,$ {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' 

SO我將其更改爲這實際上導致創建別名和我得到的錯誤:

$ 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' 

建議嗎?

回答

2

嘗試:

$ eval alias $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n') 

爲我工作。

+2

怎麼樣eval別名$(sed ...)「'?這對我來說似乎更加強大,因爲沒有*字擴展*的額外階段。它使結果更容易理解。 –

+0

謝謝,這個伎倆!我還將羅蘭德的報價與優秀的結果結合起來。 – Shaun

0

嗯,它看起來像aliasecho進行不同解釋一些反斜槓。這誠然是一個黑客,但我會嘗試這個辦法:

alias $(echo $(sed "s/\(.*\),\(rdp\|ssh\)/\1='\2 \1' /g" ${SERVER_FILE} | tr -d '\n')) 

:-)

+0

你好,這會產生相同的錯誤。 「別名」的輸出也是一樣的。 – Shaun

1

也許我建議在awk,而不是sed的一個更容易得多可讀命令?

awk 'BEGIN { FS="," 
      format = "%s=\"%s %s\" " } 
    $2 ~ /(rdp|ssh)/ { printf format, $1, $2, $1 }' ${SERVER_FILE}