有没有办法执行远程“ls”,就像“scp”执行远程复制一样?

有没有办法执行远程“ls”,就像“scp”执行远程复制一样?

有没有办法在标准 Linux shell 中执行远程“ls”,就像“scp”执行远程复制一样?

答案1

你总是可以这样做:

ssh user@host ls -l /some/directory

这将通过 SSH 连接到主机,运行 ls,将输出转储回给您并立即断开连接。

答案2

列出目录中的所有文件:

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

对于类似 find directory/path -ls 的操作

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

答案3

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

例子:

sftp [email protected]
ls
cd somedir
exit

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

sftp [user@]host[:dir]

答案4

如上所述,如果你可以通过 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 之前扩展,除非您转义$。通常使用单引号更容易避免这种情况,但您的情况可能会有所不同。有时您需要在本地和远程扩展内容,这可能很棘手。

相关内容