2

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

服务器.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

4 回答 4

1

我会尝试类似的东西:

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

这是为了避免 shell 可以对参数进行任何解释(以破折号开头的任何内容)。

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

于 2013-04-05T04:23:09.863 回答
1

这是解析命令行选项的问题吗?有时,如果您有一个命令向另一个命令发送参数,第一个命令可能会感到困惑。约定是这样使用--

echo -- "--tab -e 'ssh usr@$SERVER'";
于 2013-10-23T18:09:01.430 回答
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零件的转义,但是除非导出到临时文件,否则我尝试的一切都失败了。

于 2014-02-21T00:19:23.910 回答
0

尝试输入

评估

在 gnome 终端命令之前。

它应该是这样的:

eval /usr/bin/gnome-terminal $xargs

为我工作!

于 2014-05-26T09:43:09.107 回答