Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 具有嵌套ls和head的ssh tail无法访问_Linux_Shell_Ssh - Fatal编程技术网

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调用中做到这一点