2013-03-20 116 views
2

我有一個服務器列表的文件:GNOME終端選項卡中打開多個SSH連接

SERVERS.TXT:

192.168.0.100 
    192.168.0.101 
    192.168.0.102 

從GNOME終端劇本,我想打開一個新的終端,具有每個服務器的選項卡。

這裏是我的嘗試:

gnome-terminal --profile=TabProfile `while read SERVER ; do echo "--tab -e 'ssh [email protected]$SERVER'"; done < SERVERS.TXT` 

以下是錯誤:

Failed to parse arguments: Argument to "--command/-e" is not a valid command: Text ended before matching quote was found for '. (The text was ''ssh')

試過-e

gnome-terminal --profile=TabProfile `while read SERVER ; do echo "--tab -e'ssh [email protected]$SERVER'"; done < SERVERS.TXT` 

後除去空間,我收到了類似的錯誤:

Failed to parse arguments: Argument to "--command/-e" is not a valid command: Text ended before matching quote was found for '. (The text was '[email protected]'')

顯然有一個解析錯誤,因爲外殼是試圖通過使用空間預測和地方分隔符的幫助。服務器文件如有更改,恕不另行通知,需要查看許多不同的服務器組。

回答

1

我發現這個問題,同時尋找答案的問題OP了,但我的問題是有點不同。我知道服務器列表,他們不在文件中。

不管怎麼說,貼我沒有工作,其他的解決方案,但下面的腳本不工作,而且是我用來避開"--command/-e" is not a valid command"錯誤。

腳本應該很容易改變,以適應任何需要:

#!/bin/sh 
# Open a terminal to each of the servers 
# 
# The list of servers 
LIST="server1.info server2.info server3.info server4.info" 
cmdssh=`which ssh` 

for s in $LIST 
do 
    title=`echo -n "${s}" | sed 's/^\(.\)/\U\1/'` 
    args="${args} --tab --title=\"$title\" --command=\"${cmdssh} ${s}.com\"" 
done 

tmpfile=`mktemp` 
echo "gnome-terminal${args}" > $tmpfile 
chmod 744 $tmpfile 
. $tmpfile 
rm $tmpfile 

現在最大的問題是,爲什麼從一個文件運行時,這項工作,而不是在腳本中。當然,這個問題是關於--command部分逸出,但我什麼都試過失敗,除非導出到一個臨時文件。

1

我會嘗試這樣的:

$ while read SERVER;do echo -n "--tab -e 'ssh [email protected]$SERVER' "; \ 
    done < SERVERS.txt | xargs gnome-terminal --profile=TabProfile 

這是爲了避免任何解釋,殼可以做的參數(任何的劃線開頭)。

因爲它是(使用-n)連接字符串,有必要在它們之間添加一個空間。

1

這是解析命令行選項的問題?有時如果你有一個命令向另一個命令發送參數,第一個命令可能會感到困惑。該公約是使用--像這樣:

echo -- "--tab -e 'ssh [email protected]$SERVER'"; 
0

嘗試侏儒終端命令之前鍵入

eval

它應該是這樣的:

eval /usr/bin/gnome-terminal $xargs 

爲我工作!