Bash также завершает работу, когда заканчивается ввод для чтения. Это может произойти несколькими способами, наиболее распространенными из которых являются чтение последней строки сценария оболочки, ввод пользователем control -D или... закрытие окна терминала.
(Вы также можете попробовать bash -i < /dev/null
и заметить, как он немедленно завершает работу, потому что у него закончились входные данные ).
sudo cat >> /root/.ssh/authorized_keys
Эта команда не будет делать то, что вы думаете.
Оболочка (, работающая под обычным пользователем ), реализует перенаправление еще до того, как начнет выполнять команду sudo cat
. В результате перенаправление происходит от имени пользователя, не являющегося -root, у которого явно не будет прав на запись в файл authorized_keys
root.
Стандартный обходной путь — использовать вместо этого команду tee
с sudo:
#!/bin/bash
for i in $(cat hosts)
do cat team.keys | sshpass -f pass ssh -t -o "StrictHostKeyChecking no" \
normal_user@ad@${i} "sudo tee -a /root/.ssh/authorized_keys >/dev/null"
done
В этой версии удаленная оболочка, запущенная как normal_user@ad
, будет выполнять команду как sudo <some parameters for sudo> >/dev/null
, а команда sudo
получит root-доступ и выполнит tee /root/.ssh/authorized_keys
.
Команда tee
получит ключи, передаваемые по конвейеру из стандартного ввода, и запишет одну копию своих входных данных в файл /root/.ssh/authorized_keys
, что она может сделать, поскольку работает от имени пользователя root, и передаст другую копию в стандартный вывод.. Дополнительная копия возвращается к первой удаленной оболочке, запущенной как normal_user@ad
, которая затем отправит ее на /dev/null
.