Я думаю, что то, что вы спрашиваете, не легко выполнимо, возможно даже невозможно с базовыми сценариями 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
[1] https://help.ubuntu.com/community/SSH/OpenSSH/Keys