我有一个类似的问题,就是我想使用vimdiff在一组使用cssh和sudo的大多数相似主机上编辑配置文件,您也许可以使我的解决方案适应您的工作流程。
sudoedit(sudo的一部分)允许您以常规用户身份使用任何编辑器来编辑您没有写许可权的文件,并且可以使用环境变量指定编辑器。sudoedit复制文件,使用副本的名称调用编辑器,然后等待编辑器退出,然后将修改后的副本复制回原来的位置。所以我创建了一个不会编辑的“编辑器”,只是记下文件以备后用,然后等待,并在vimdiff周围使用了该标记的包装器。
第一个文件是〜/ .bin / redit
#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $file = $ENV{HOME}.'/.var/redit/'.hostname();
sub cmkdir($){
my $_=shift;
mkdir $_ unless -d $_;
}
cmkdir $ENV{HOME}.'/.var/';
cmkdir $ENV{HOME}.'/.var/redit/';
foreach (@ARGV){
my $fh;
open $fh, '>', $file.'na' or warn;
print {$fh} $_;
close $fh;
symlink $_, $file or die;
print;
<STDIN>;
unlink $file or die;
unlink $file.'na' or die;
}
第二个是〜/ .bin / redit1
#!/usr/bin/perl -w
use strict;
use warnings;
use Sys::Hostname;
my $h=hostname();
@ARGV=qw(host1 host2 host3 host4) unless @ARGV;
print join " ", qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
exec qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
我使用它们的方式是使用cssh打开与所有四个主机的连接,然后使用,然后使用EDITOR=~/.bin/redit sudoedit /etc/conf/file
,然后在不同的窗口中运行~/.bin/redit1
,进行更改,保存并退出,切换回cssh并按Enter提交更改并退出sudoedit(除非我要编辑多个文件,在这种情况下,redit会前进到列表中的下一个文件,并且您需要对下一个文件再次运行redit1。)
由于您正在做的事情并不那么复杂,您只需要使用一个远程主机就不需要redit1了,因此您只需将sftp编辑器指向host:.var / redit / host或等效主机即可。
sudo
。