2013-03-20 112 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 

为我工作!