我想分配一个远程授权密钥文件列表到本地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_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