有没有办法像在标准linux shell中进行远程复制一样,执行远程“ ls”操作?

评论

我可以看到这样做很不错,但是为什么不直接使用SSH并执行ls呢?

@SpacemanSpiff-这样您就可以编写脚本。这就是我到达此页面的方式。

#1 楼

您总是可以这样做:

评论


...如果您具有真正的Shell访问权限。某些系统具有特殊的外壳,该外壳仅接受某些scp和rsync调用,也可能接受sftp,仅此而已。

– glglgl
2014年6月6日22:11

您如何将其别名为“ rls”?

–海象猫
2014年10月18日在16:24

@WalrustheCat别名rls =“ ssh user @ host ls -l”重新启动外壳,并且rls / some / directory应该可以工作。

–chishaku
2015年10月10日9:17



唯一的问题是找不到文件会返回错误代码,而我这样做的原因恰恰是我要调用ls的原因。

–史蒂夫·科恩(Steve Cohen)
17年11月28日在18:54

不关注@SteveCohen。您是否要从远程ls获得错误代码?如果是这样,$?在执行命令后立即包含它。 (例如,如果我在找不到的文件上[本地或远程]运行此命令,则返回2)

– Corey S.
17年11月28日在23:42

#2 楼

列出目录中的所有文件:

rsync host.name.com:directory/path/'*'


查找目录/路径-ls

rsync -r host.name.com:directory/path


评论


如果主机上未安装rsync,则会得到类似bash:rsync:的命令。我猜这意味着它在后台使用SSH吗?

–mwfearnley
2015年9月25日上午10:23

请注意,格式类似于ls -l。在我的系统上,似乎没有列出所有文件的选项。

–乔纳森
16年5月3日,11:37

@mwfearnley:否,尽管大多数包装都将ssh定义为rsync的推荐或依赖项,但很有可能安装一个而不安装另一个。

–symcbean
20/09/11在23:03

#3 楼

对于所有通过google来问这个问题的人,因为他们正在寻找一种列出远程文件但无法通过ssh(备份服务器的常见情况)访问远程服务器的方法,则可以使用sftp。示例:

sftp username@hostname.xyz
ls
cd somedir
exit


在特定的远程目录中启动交互式会话:

sftp [user@]host[:dir]


#4 楼

是。 SSH并执行ls

ssh host ls /path


您可以轻松地编写脚本以使其更加灵活,或者使用scp所使用的host:path语法。

#5 楼

我发现我最常用的方法是获取ls结果,一个没有所有权限和日期等的简单文件列表并将其保存在本地文件中。

{ ssh me@host.com "cd /dir/of/interest; ls -1f *.txt;" } > /home/me/listoffiles.txt


您可以在引号内运行任何内容。所有输出最终都存储在本地文本文件中。或者,如果您想在服务器上运行一个讨厌的脚本并捕获其所有输出,甚至出现错误,请执行以下操作:

{ ssh me@host.com <script.remote.sh } > /home/me/output.log 2>/home/me/output.err


评论


在第二行代码中,不需要{}。

– glglgl
2014年6月6日22:12

第一条代码行中的@ glglgl +也同样(这是引用,也是唯一的引用,它控制发送到远程系统以执行什么内容)

–dave_thompson_085
20年9月13日在8:09

#6 楼

如前所述,如果可以通过SSH进入主机,则可以执行任何操作。
可以使用ssh user@hostssh alias(在~/.ssh/config中定义)
示例
编辑:单个修复了一些示例引用要发送的整个命令。感谢@ dave_thompson_085指出了问题。
 $ ssh user@host 'ls /dir/file'
 

您提到您不想从ls接收错误该文件不存在。
一种选择是只丢弃错误消息
 $ ssh user@host 'ls /dir/file 2>/dev/null'
 

这将保留返回值也一样因此,仅当ls命令找到/ dir / file时,$?才为0。这很好,因为它适用于文件,文件夹,符号链接或ls可以列出的任何内容。
另一种选择是在列出之前检查文件是否存在。
 $ ssh user@host '[ -f /dir/file ] && ls /dir/file'
 

您也可以测试并列出文件夹,但是语法会发生变化
 $ ssh user@host '[ -d /dir/sub ] && ls /dir/sub'
 

您也可以链接并测试任何内容
 $ ssh user@host '[ -f /dir/file ] || [ -d /dir/file ] && ls /dir/file'
 

您还可以只检查该项目是否存在,什么也没有
 $ ssh user@host '[ -f /dir/file ] || [ -d /dir/file ]'
$ echo $? # exit code will be 0 ONLY if the file exists
0
 

您可能还希望对[ -L /my/target ]进行符号链接测试。
您可以远程运行条件代码
 $ ssh user@host '[ -f /dir/file ] && echo "File EXISTS!" || echo "File NOT FOUND!"'
File EXISTS!
 

或在本地,如果将命令移到命令字符串之外
 $ ssh user@host '[ -f /dir/file ]' && echo "File EXISTS!" || echo "File NOT FOUND!"
File EXISTS!
 

引用和扩展的工作方式可能很棘手。如果在主命令之外使用双引号(而不是上面的单引号),则在连接ssh之前,变量将被扩展,除非您转义了$。通常,使用单引号可以避免这种情况,但是您的里程可能会有所不同。有时您需要一些东西来在本地和远程扩展,这很棘手。

评论


您的第二个例子是错误的; ls在本地运行或尝试运行。同样,在您的第5个示例中,回显在本地运行(对于echo可以),而在第6个示例中,{}不会改变它。最后,对于具有历史记录扩展的外壳,通常是交互式bash和zsh,回显“ FILE EXISTS!”。不起作用(在任何地方,不仅限于ssh)。

–dave_thompson_085
20-09-13在8:08

感谢您指出。我已(固定地)确定了答案,并添加了更多示例和说明。干杯!

–Gus Neves
20 Sep 14 '23:32