Я думаю, что то, о чем вы спрашиваете, нелегко выполнимо, возможно, даже невозможно с помощью базовых сценариев bash.
Поэтому следующее не совсем отвечает на ваш вопрос, но предлагает другой подход к вашей проблеме.
Вместо использования sshpass
, вы можете использовать обычную команду scp
с аутентификацией по публичному ключу без пароля. См. [1], если вы не знаете, что это такое.
Если вы собираетесь использовать scp в скриптах для локального использования, то, IMO, лучше поступить так:
ssh-copy-id
для добавления вашего публичного ключа на серверЭтого уже достаточно, чтобы иметь возможность выполнить вашу команду без подсказки:
scp -r me8@host.ca:/cmshome/me/file /home/me/Desktop
Для скриптов, которые вы хотите распространять, sshpass с открытым паролем, конечно, не очень хорошая идея, вы должны по крайней мере использовать флаг sshpass "-e" и позволить пользователю указать пароль как переменную окружения для большей безопасности.
В этом случае подход с открытым ключом немного менее удобен, но все же возможен. Если вы не можете позволить себе попросить пользователя скрипта создать открытый ключ, вы можете создать открытый ключ на лету, скопировать его на сервер и выполнить scp
без каких-либо подсказок:
#!/bin/bash
KEY="$HOME/.ssh/id_rsa_example"
if [ ! -e "$KEY" ]; then
ssh-keygen -t rsa -N "" -f "$KEY"
sshpass -e ssh-copy-id -i "${KEY}.pub" me8@host.ca
fi
scp -r me8@host.ca:/cmshome/me/file /home/me/Desktop
Наконец, есть еще возможность использовать rsync
, чтобы сделать вместо него индикатор выполнения:
$ rsync -P --rsh="sshpass -p $PASSWORD ssh -l me8" host.ca:/cmshome/me/file /home/me/Desktop
У меня возникла та же проблема. Добавив --quiet
при запуске связки ключей в.profile,Я снова мог использовать клиент x2go для доступа к серверу.
eval keychain --quiet --eval --agents ssh....