필자는이 작업을 수행하는 Perl 스크립트를 가지고 있습니다. 시스템에서 ssh 인증 키를 생성 한 다음이 키를 암호가없는 ssh 연결을 위해 원격 Linux 시스템에 복사합니다. 코드는 다음과 같습니다 : 내가 가지고있는Perl에서 "ssh-copy-id"명령의 실행 상태를 어떻게 표시 할 수 있습니까?
# Generate an rsa key and store it in the given file
system("ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa 1>/dev/null");
# Copy the generated key to a remote system whose username
# is stored in variable $uname and IP address is stored in variable $ip
system("ssh-copy-id -i /root/.ssh/id_rsa.pub $uname\@$ip 2>&1 1>/dev/null");
문제는이 경우 : ssh-copy-id
명령은 원격 시스템에 키를 복사하기 위해 꽤 많은 시간이 걸립니다. 따라서이 Perl 스크립트가 실행되면 스크립트가 중단 된 것처럼 나타납니다.
그러므로 "진행 메시지"를 표시하고 싶습니다 : 복사가 진행 중일 때 "SSH 인증 키 복사 진행 중"을 표시하고 복사가 실패하면 "복사 실패"를 표시합니다. 그것은 성공했으며 "Copy succeeded"라고 표시합니다.
어떻게해야합니까?
하나 더 (차스의 답변에 따라) : 차스이
다이를 제안
나는 코드를 시도했다 "포크 없습니다! $를" 정의되지 않은 한 (my $ pid = fork); #child 다음 잠들지
는 임의의 종료 코드로 종료
하지 않는 한 ($의 PID) {
인쇄 "서버에 연결"; exec "ssh-copy-id -i /root/.ssh/id_rsa.pub $ uname \ @ $ ip 2> & 1 1/dev/null";
exit int rand 255; |
}
#parent는
$을 완료 아이를 기다립니다 = 1;
인쇄 "대기 :";
my @throbber = qw /. o O o. /; ($ waitpid를 PID = (-1, WNOHANG)) {다음 프레임
내 $ 프레임 = 시프트 @throbber #get
까지 ;
프레임 푸시 @throbber, $ 프레임리스트의 마지막에 #put
#display it<br />
print $frame;
; 원격 서버에 연결하는 동안
지금 복사 SSH-ID가 패스워드 입력을 요구 :
#wait a quarter second<br />
select undef, undef, undef, .25;<br />
#backspace over the frame<br />
print "\b";<br />
}
문제는이된다. 따라서 "throbber"출력 (즉, 다양한 크기의 원이 표시됨)은 암호 입력 이후에 나타나며 이상하게 보입니다. 이것은 다음과 같습니다 :
현재 출력
원격 서버에 연결 o0O0o # 이것은 진동합니다., 출력은 정확히처럼 보이지 않는하지만 난 출력을 변경 동적으로 인쇄 할 수 있습니다 I
암호 : o0O0oXXXXXo0O0o #You은 바로, 색인기를 불필요하게 암호에 온다 너무
출력을하라는 메시지가 얻을 I 원하는 :
는 원격 서버 o0O0o #The에 연결 여기 만 표시되어야 색인기, 다른 곳
암호 : XXXXX
모든 아이디어, 사람
?
이 얼마나 오래 가능성이 SSH 키를 복사하기 위해 취할 수있는 어떤 원격 시스템에? 전화 접속 회선을 통해조차? – innaM
@Manni 분명히 dns-reverse-lookup 및 GSSAPIAuthentication 문제가 발생하지 않았습니다. 나는 앉아서 잠시 기다려야했다. –
내 .ssh/config 파일의 맨 위에있는 행에 "GSSAPIAuthentication no"라는 이유가 있습니다. – innaM