gnome终端标签打开多个ssh连接

时间:2013-03-20 22:20:08

标签: shell ssh tabs gnome gnome-terminal

我有一个包含服务器列表的文件:

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 usr@$SERVER'"; done < SERVERS.TXT`

这是错误:

  

无法解析参数:“--command / -e”的参数不是有效命令:文本在找到'匹配引号'之前结束。 (文字是''ssh')

尝试删除-e

之后的空格
gnome-terminal --profile=TabProfile `while read SERVER ; do echo "--tab -e'ssh usr@$SERVER'"; done < SERVERS.TXT`

我得到了类似的错误:

  

无法解析参数:“--command / -e”的参数不是有效命令:文本在找到'匹配引号'之前结束。 (案文是'usr@192.168.0.100'')

显然有一个解析错误,因为shell试图通过使用空格来预测和放置分隔符来提供帮助。服务器文件如有更改,恕不另行通知,需要查看许多不同的服务器集。

4 个答案:

答案 0 :(得分:1)

我会尝试类似的事情:

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

这是为了避免shell可以对参数做任何解释(任何以破折号开头的东西)。

因为它是连接字符串(使用-n),所以需要在它们之间添加空格。

答案 1 :(得分:1)

这是解析命令行选项的问题吗?有时如果你有一个命令向另一个命令发送参数,第一个可能会混淆。惯例是使用像这样的--

echo -- "--tab -e 'ssh usr@$SERVER'";

答案 2 :(得分: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部分的转义,但我尝试的一切都失败了,除非导出到临时文件。

答案 3 :(得分:0)

尝试输入

  

EVAL

在gnome终端命令之前。

它应该是这样的:

eval /usr/bin/gnome-terminal $xargs

为我工作!