将远程authorized_keys文件的列表分配给本地variables

我想分配一个远程授权密钥文件列表到本地variables。

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 [email protected] "ls /home/*/.ssh/authorized_keys") 

但是你需要以root身份连接到ssh-server

 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 

最容易出错的方法实际上是从passwd数据库获取每个用户的HOME目录并检查其是否为authorized_keys文件。 另请注意,openssh支持authorized_keysauthorized_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