Я запускаю сценарий оболочки для добавления отпечатков пальцев в known_hosts.
Код такой:
status=$(ssh-keyscan -T 5 $remotehost >> ~/.ssh/known_hosts 2>&1)
if [[ $? != 0 ]]; then
echo -n Error: ""
echo "$status"
exit 1
fi
Результат такой:
ssh-keyscan -T 5 example.com
# example.com SSH-2.0-OpenSSH_5.3
example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA.....o9sgjFlqfli7ZQ==
До недавнего времени у меня не было проблем, но в последнее время ssh-keyscan
добавляет эти комментарии в stderr об успехе и заполняет мой файл hosts мусором. Это в конечном итоге приводит к ошибке файла hosts после того, как один и тот же хост использовался дважды из-за ssh-keygen -R example.com
команда забежала вперед, чтобы избежать дублирования.
Мне не удалось найти способ отключить этот комментарий stderr.
Исходный сценарий (я думаю) правильный, за исключением порядка перенаправлений. Поменяйте их местами так, чтобы сначала stderr отправлялся на stdout, а затем перенаправлял stdout в файл (оставляя stderr без изменений). Это дает вам чистый выходной файл и все ошибки, хранящиеся в переменной.
Непроверено, но так должно работать.
Итак, первая строка скрипта должна быть ...
status=$(ssh-keyscan -T 5 $remotehost 2>&1 >> ~/.ssh/known_hosts )
Возможно, я что-то упускаю, но меняю 2>&1
к 2>/dev/null
должен сделать свое дело.
Я бы, вероятно, сделал то, что вы хотите, что-то вроде этого, как написано, ваш $ status никогда ничего не будет содержать, потому что вы перенаправляете весь вывод в ~ / .ssh / known_hosts
ssh-keyscan -T 5 $remotehost >> ~/.ssh/known_hosts 2>~/.ssh/error.log
if [[ $? != 0 ]]; then
echo -n Error: ""
cat ~/.ssh/error.log
exit 1
fi