У меня есть Perl-скрипт, который делает это: он генерирует ключ аутентификации ssh в моей системе, а затем копирует этот ключ в удаленную систему Linux для парольных соединений ssh. Код как ниже:
# 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», а если копирование не удалось, отобразить «Не удалось скопировать» и, если оно удалось, отобразить «Копирование выполнено».
Как мне это сделать?
Еще один (на основании ответа Часа):
Я попробовал код, как предложил Час
умри "не мог раскошелиться: $!" если не определено (мой $ pid = fork);
# ребенок спит, затем выходит со случайным кодом выхода
если ($ pid) {
распечатать «Подключение к серверу»;
exec "ssh-copy-id -i /root/.ssh/id_rsa.pub $ uname \ @ $ ip 2> & 1 1> / dev / null";
выход int rand 255;
}
# родитель ждет, пока ребенок закончит
$ | = 1;
распечатать "ожидание:";
мой @throbber = qw /. o O o. /;
до ($ pid = waitpid (-1, WNOHANG)) {
# получить следующий кадр
мой $ frame = shift @throbber;
#display it<br />
print $frame;
# введите его в конец списка кадров
push @throbber, $ frame;
#wait a quarter second<br />
select undef, undef, undef, .25;<br />
#backspace over the frame<br />
print "\b";<br />
}
Проблема в следующем:
Теперь ssh-copy-id запрашивает ввод пароля при подключении к удаленному серверу. Таким образом, вывод «пульсирующего» (то есть отображаемого круга различного размера) происходит после ввода пароля, что выглядит странно. Вот как это выглядит:
ТЕКУЩИЙ ВЫХОД
Подключение к удаленному серверу o0O0o # Это пульсатор. Вывод не совсем так, но я не могу напечатать динамически изменяемый вывод, могу ли я
Пароль: o0O0oXXXXXo0O0o # Вы правильно поняли, пульсатор неоправданно приходит и в приглашении пароля
ВЫХОД, КОТОРЫЙ Я ХОЧУ:
Подключение к удаленному серверу o0O0o # Пульсирующее устройство должно отображаться ЗДЕСЬ ТОЛЬКО, НИГДЕ ДРУГОЕ
Пароль: XXXXX
Есть идеи, кто-нибудь?