После горячей битвы между мной и компьютером у меня наконец-то появился ответ, который не обсуждался ни в одной из статей, которые я мог найти. Я опубликую блог об этом.
Решение состоит в том, чтобы использовать новую функцию, исправленную только в альфа-версии ant 1.8.3, которая, по-видимому, является исправлением ошибки по сравнению с релизной версией 1.8.2, поэтому она, вероятно, достаточно стабильна даже с альфа-заголовком. Эта функция позволяет передавать данные в STDIN сценария, а именно в пароль. Затем вы можете использовать стандартные инструменты Linux или Cygwin в Windows, чтобы read
пароль с STDIN и использовать его в качестве переменной.
Нет зависимостей, нет файлов ключей, нет утечки пароля в командной строке, нет сохраненных паролей. Наконец-то я вижу свет за пределами этого мрачного мрачного существования, которое я пережил за последние несколько дней.
Вот задача ANT, которая делает именно это:
<input message="Enter username for ${website.host}:" addproperty="host.username" />
<input message="Enter password for ${website.host}:" addproperty="host.password" />
<sshexec host="${website.host}" trust="true"
username="${host.username}" password="${host.password}"
inputstring="${host.password}"
command='read var; expect -c "spawn sudo chmod u+x /usr/local/website/bin/start_website" -c "expect ${host.username}:" -c "send ${var}\r" -c "wait"' />
Обратите внимание на командную строку:
read var; expect -c "spawn sudo chmod u+x /usr/local/website/bin/start_website" -c "expect ${host.username}:" -c "send ${var}\r" -c "wait"
Сначала мы read
STDIN в переменную var
. Затем мы запускаем функцию expect
которая выполняет некоторые действия, требующие взаимодействия с пользователем: в данном случае sudo
Когда sudo
запрашивает у нас пароль, мы отправляем его из сохраненной переменной var
и wait
завершения процесса.