Я хотел бы назначить список файлов удаленных авторизованных ключей локальной переменной.
INCLUDE=$(ssh myhost.mydomain.com "for Z in `awk -F : '{print $1}' /etc/passwd`; do INCLUDE+=\"/home/${Z}/.ssh/authorized_keys \"; done; echo $INCLUDE")
Как я могу правильно избежать вышеуказанной команды, чтобы сделать ее действительным запросом?
Используя этот оператор, вы получите странный результат, например / home / bin, / home / root или / home / daemon.
for Z in `awk -F : '{print $1}' /etc/passwd`; do INCLUDE+="/home/${Z}/.ssh/authorized_keys "
ls /home/*/.ssh/authorized_keys
подходит лучше.
Итоговый сценарий может быть таким:
INCLUDE=$(ssh root@myhost.mydomain.com "ls /home/*/.ssh/authorized_keys")
Но вам нужно подключиться к ssh-серверу как root
Наиболее подверженным ошибкам методом было бы получить HOME каталог каждого пользователя из базы данных passwd и проверить его на наличие authorized_keys
файлы. Также обратите внимание, что openssh поддерживает оба authorized_keys
И authorized_keys2
файлы.
Эта команда должна выдать такой список:
getent passwd | awk -F: '$6!=""{print $6}' | \
xargs -rI{} find {} -maxdepth 2 -mindepth 2 \
-path \*/.ssh/\* \
\( -name authorized_keys -o -name authorized_keys2 \) \
-type f 2>/dev/null
Вы должны соответствующим образом экранировать кавычки, если собираетесь выполнять его через ssh. Однако вы можете поместить его в файл сценария и передать его /bin/sh
на удаленной стороне:
<scriptfile ssh remote.host /bin/sh
sgeorge-mn:~ sgeorge$ cat awk_ssh.sh
ssh -q suku@192.168.97.128 <<'HERE'
cat /etc/passwd | grep '/bin/bash'| awk -F: '{system("ls /home/"$1"/.ssh/authorized_keys")}'
HERE
sgeorge-mn:~ sgeorge$ INCLUDE=$(bash awk_ssh.sh)
suku@192.168.97.128's password:
sgeorge-mn:~ sgeorge$ echo $INCLUDE
/home/root/.ssh/authorized_keys /home/suku/.ssh/authorized_keys