SSH上的DIR循环

时间:2018-09-18 17:18:53

标签: bash ssh

使用ssh登录到远程服务器

ssh user@01.01.03.04 -i /path/to/ppk.key

然后运行

[user@ip-01-01-03.04 ~]$ sudo su - 
[root@ip-01-01-03.04 ~]# for curdir in $(dir /); do echo "fil=$curdir" ; done

有效列出所有根目录:

fil=bin
fil=dev
fil=lib

但是尝试从远程进行操作以在本地检索结果对我来说很棘手:

ssh user@01.01.03.04 -i /drives/c/pass/keys/MY.ppk "sudo -i -u root bash -c 'for curdir in \$(dir \/); do echo "fil=$curdir" ; done'"

给予:

fil=var
fil=var
fil=var 
(...)

ssh user@01.01.03.04 -i /drives/c/pass/keys/MY.ppk "sudo -i -u root bash -c 'for curdir in \$(dir \/); do echo "fil=\$curdir" ; done'"

给予

fil=
fil=
fil=
(...)

2 个答案:

答案 0 :(得分:1)

另一种方法呢?您无需root就可以列出/。因此,无需使用sudo或ssh进行root。另外,由于您实际上只想在远程服务器上获得/的列表,所以为什么不只使用ssh并运行dir命令呢?循环然后可以是局部的。像这样吗?

for curdir in $(ssh localhost dir /); do
    echo "fil=${curdir}"
done

希望这会有所帮助

答案 1 :(得分:1)

双引号内的变量由本地外壳扩展,因此您需要像在第二个版本中那样转义美元符号。

此外,双引号内的双引号将终止字符串,您还需要对其进行转义。

顺便说一句,不需要逃脱/

ssh user@01.01.03.04 -i /drives/c/pass/keys/MY.ppk "sudo -i -u root bash -c 'for curdir in \$(dir /); do echo `"fil=\$curdir`" ; done'"

使用here-doc通常更容易编写:

ssh user@01.01.03.04 -i /drives/c/pass/keys/MY.ppk <<'EOF'
sudo -i -u root bash -c 'for curdir in $(dir /); do echo "fil=$curdir" ; done'
EOF

EOF标记周围加上单引号会将此处文档视为单引号字符串,因此$不会被特殊对待。