我想将远程授权密钥文件列表分配给本地变量。
INCLUDE=$(ssh myhost.mydomain.com "for Z in `awk -F : '{print $1}' /etc/passwd`; do INCLUDE+=\"/home/${Z}/.ssh/authorized_keys \"; done; echo $INCLUDE")
我怎样才能正确地转义上述命令以使其成为有效请求?
答案1
使用此语句,您会得到一些奇怪的结果,如 /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 [email protected] "ls /home/*/.ssh/authorized_keys")
但是你需要以 root 身份连接到 ssh-server
答案2
sgeorge-mn:~ sgeorge$ cat awk_ssh.sh
ssh -q [email protected] <<'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)
[email protected]'s password:
sgeorge-mn:~ sgeorge$ echo $INCLUDE
/home/root/.ssh/authorized_keys /home/suku/.ssh/authorized_keys
答案3
最容易出错的方法实际上是从 passwd 数据库中获取每个用户的 HOME 目录并检查其中的authorized_keys
文件。另请注意,openssh 支持authorized_keys
ANDauthorized_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