Linux 具有嵌套ls和head的ssh tail无法访问
我正在尝试执行以下命令:Linux 具有嵌套ls和head的ssh tail无法访问,linux,shell,ssh,Linux,Shell,Ssh,我正在尝试执行以下命令: $ ssh root@10.10.10.50 "tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )" ls: cannot access /var/log/alert_ARCDB.log: No such file or directory tail: cannot follow `-' by name 注意返回的错误,当我单独登录到ssh然后执行时 tail -F -n 1 $(ls -t /v
$ ssh root@10.10.10.50 "tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
ls: cannot access /var/log/alert_ARCDB.log: No such file or directory
tail: cannot follow `-' by name
注意返回的错误,当我单独登录到ssh然后执行时
tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
见下文:
# ls -t /var/log/alert_ARCDB.log | head -n1
/var/log/alert_ARCDB.log
为什么会发生这种情况以及如何解决它。我试图在一行中完成这项工作,因为我不想创建脚本文件
非常感谢Shell参数在命令执行之前展开 这里有一个简单的例子。如果我打字
ls "$HOME"
…shell首先用my HOME目录的路径替换$HOME
,然后运行类似于ls/HOME/larsks
的程序。ls
命令不知道命令行原来有$HOME
如果我们看看你的命令
$ ssh root@10.10.10.50 "tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )"
…我们看到你的处境完全相同。$(ls-t…
表达式在执行ssh
之前展开。换句话说,该命令正在运行本地系统
您可以使用单引号禁止本地系统上的shell扩展。例如,运行:
echo '$HOME'
将产生:
$HOME
因此,您可以运行:
ssh root@10.10.10.50 'tail -F -n 1 $(ls -t /var/log/alert_ARCDB.log | head -n1 )'
但这里还有另一个问题。如果/var/log/alert\u ARCDB.log
是一个文件,那么您的命令就没有意义:在单个文件上调用ls-t
不会得到任何结果
如果alert ARCDB.log
是一个目录,则会出现另一个问题。ls/some/directory的结果是没有任何目录前缀的文件名列表。如果我运行以下操作:
ls -t /tmp
我会得到像这样的输出
file1
file2
如果我这样做:
tail $(ls -t /tmp | head -1)
我最终得到一个命令,如下所示:
tail file1
这将失败,因为我当前的目录中没有
file1
。一种方法是将要执行的命令通过管道传输到ssh。实现这一点的一个简单方法是首先创建一个函数,该函数将响应您希望执行的命令:
remote_commands()
{
echo 'cd /var/log/alert_ARCDB.log'
echo 'tail -F -n 1 "$(ls -t | head -n1 )"'
}
cd
将允许您使用ls
列出的相对路径。单引号确保所有内容都按原样发送到远程shell,而不会发生本地扩展
那你就可以了
ssh root@10.10.10.50 bash < <(remote_commands)
sshroot@10.10.10.50bash<感谢您的解释,现在对我来说真的很有意义,但是日志文件存在于远程服务器中。所以我做了下面的工作,效果很好root@10.10.10.50尾部-F-n 1$(ssh)root@10.10.10.50ls-t/var/log/alert_ARCDB.log | head-n1)但是我做了两次ssh,有没有办法在一次ssh调用中做到这一点