cssh
저는 Debian 10(패키지) 을 사용하고 있습니다 clusterssh 4.13.2-2
.
여러 서버에 연결할 때:
cssh foo bar zz aa
cssh는 4개의 터미널을 열고알파벳순으로! 이렇게 하면 다음과 같이 화면의 창 순서를 지정할 수 있습니다.
aa bar
foo zz
이것은 순수한 악입니다!
창을 원래 순서대로 유지하려면 어떻게 해야 합니까? Perl 코드에 몇 가지 빠른 수정 사항이 있습니까?
답변1
근사치를 살펴보면원천@servers
, 주어진 순서대로 원래 호스트 이름 매개변수를 보유하는 것으로 보이는 배열 과 %servers
호스트 이름에서 파생된 키로 색인화된 모든 호스트별 정보를 보유하는 해시(정렬되지 않은 사전)가 있음을 알 수 있습니다.
존재하다클라이언트 창 열기, 순서가 지정된 이름 배열로 호출되는 것으로 보이며 여기서 각 %servers
항목을 생성합니다.
에서는 retile_hosts()
주어진 순서대로 창이 열리고 $sort->( keys(%servers) )
코드는 다음으로 시작합니다.여기, 따라서 표시되는 순서입니다.
따라서 가능한 해결책은 추가 필드에서 각 서버 항목이 생성된 순서를 유지한 다음 $sort
키 대신 해당 값을 기준으로 정렬되도록 기능을 변경하는 것입니다. (키를 변경하는 것이 더 간단하지만 많이 사용되며 알 수 없는 결과가 발생할 수 있습니다.)
다음 패치는 내 Fedora 28 버전에서 작동합니다. ClusterSSH.pm
배포 버전에 대해 이 설정을 변경해야 할 수도 있습니다.
--- usr/share/perl5/vendor_perl/App/ClusterSSH.pm.orig 2022-08-24 10:47:57.937143651 +0200
+++ usr/share/perl5/vendor_perl/App/ClusterSSH.pm 2022-08-24 11:32:43.637808164 +0200
@@ -116,9 +116,12 @@
my $host_menu_static_items; # number of items in the host menu that should
# not be touched by build_host_menu
my (@dead_hosts); # list of hosts whose sessions are now closed
-my $sort = sub { sort @_ }; # reference to our sort function which may later
+#my $sort = sub { sort @_ }; # reference to our sort function which may later
# be changed in run() if the user has asked for
# natural sorting
+# sort using original order of cli args
+# https://unix.stackexchange.com/a/714683/119298
+my $sort = sub { sort {$servers{$a}{order} <=> $servers{$b}{order}} @_ };
$keysymtocode{unknown_sym} = 0xFFFFFF; # put in a default "unknown" entry
$keysymtocode{EuroSign}
@@ -667,6 +670,8 @@
#$xdisplay->flush(); # dont flush here, but after all tiling worked out
}
+# sort using original order of cli args
+my $globalorder;
sub open_client_windows(@) {
my $self = shift;
foreach (@_) {
@@ -727,6 +732,8 @@
$servers{$server}{port} = $port || '';
$servers{$server}{master} = $self->config->{mstr} || '';
$servers{$server}{master} = $master if ($master);
+ # sort using original order of cli args
+ $servers{$server}{order} = ++$globalorder;
$self->debug( 2, "Working on server $server for $_" );