我目前在脚本中有以下几行代码:
set -A ARRAY OPTION1 OPTION2 OPTION3 OPTION4
set -A matches
for OPTION in ${ARRAY[@]}; do
DIFF=$(ssh $USER@$host " diff $PERSONALCONF $PRESETS$OPTION" )
if [[ $DIFF == "" ]]; then
set -A matches"${matches[@]}" $OPTION
fi
done
基本上,我有一个循环遍历预定义数组中的每个元素,连接到远程服务器(每次都是相同的服务器),然后使用diff命令将文件与循环定义的文件进行比较。基本上,它将personal.conf文件与personal.conf.option1,personal.conf.option2等进行比较。如果没有区别,则将其添加到数组中。如果有差异,没有任何反应。
我想知道是否可以执行此操作或获得相同的结果(将匹配的文件存储在主机上的数组中,而不是连接到的服务器上),只需通过SSH连接一次。我无法在远程服务器上存储任何内容,也无法在该服务器上执行远程脚本。我只能通过ssh发出命令(一种愚蠢的设置)。目前,它连接的次数与选项的次数相同。这似乎效率低下。如果有人有更好的解决方案,我很乐意听到它。
答案 0 :(得分:3)
有几个选择:
您可以使用OpenSSH多路复用功能(请参阅ssh(1)
)。
此外,大多数shell都乐意接受一个脚本来运行stdin,所以你可以运行像
这样的东西cat script.sh | ssh $HOST /bin/sh
大多数脚本语言(Perl,Python,Ruby等)都有一些允许连接重用的SSH模块:
#!/usr/bin/perl
use Net::OpenSSH;
my ($user, $host) = (...);
my @options = (...);
my @matches;
my $ssh = Net::OpenSSH->new("$user\@$host");
for my $option (@options) {
my $diff = $ssh->capture("diff $personal_conf $presets$option");
if ($ssh->error) {
warn "command failed: " . $ssh->error;
}
else {
push @matches, $option if $diff eq '';
}
}
print "@matches\n";