有没有办法在标准 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@host
或ssh 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 之前扩展,除非您转义$
。通常使用单引号更容易避免这种情况,但您的情况可能会有所不同。有时您需要在本地和远程扩展内容,这可能很棘手。