Bash脚本从dev和生产中获取日志文件失败

时间:2012-10-29 06:57:23

标签: bash ssh

我拼凑了以下脚本:

ssh -2 -l root devserver "cd /var/log/httpd; ls | grep -v 'gz' | xargs -- tail -n 15"

这将登录到devserver,chagnes目录到httpd日志,列出它们,删除数百个压缩历史轮换,然后将其输入到尾部。

可以轻松查看正在发生的错误类型。当我自己ssh,然后用引号执行命令时,这个工作。但是,当使用它作为脚本时,生产中的输出会出现乱码,我会注意到dev上的chimes,就像它将输出视为命令而不是简单文本一样。

我确信有一些逃脱或某些我不知道。

注意: - 以root身份进行SSH访问,因为通常的ssh用户无法读取httpd日志。 - 因为当我不在相关目录中时,tail无法找到从grep传入的文件。

2 个答案:

答案 0 :(得分:3)

要查看使用的解释器:

ssh risdevo0196 'echo $0'

如果是ksh:

tail -n 15 /var/log/httpd/!(*gz)

如果是bash

shopt -s extglob; tail -n 15 /var/log/httpd/!(*gz)

但如果参数列表太长,则必须使用find:

find /var/log/httpd/ \! -name '*gz' -exec tail -n 15 {} +

答案 1 :(得分:1)

为了您的目标,我认为find会比解决方法ls更好更简单:

ssh -2 -l root devserver 'find /var/log/httpd/ -type f ! -name "*.gz" -print0 | xargs -0 tail -n 15'

echo '
    find /var/log/httpd/ -type f ! -name "*.gz" -print0 |
        xargs -0 tail -n 15
  ' | ssh -2 -l root devserver

当你希望能够轻松查看正在发生的错误时,我有时会使用一些方法:( Warnind:如果你的话,这可能是 overkill logfiles很大,小心!!)

echo '
    find /var/log/httpd/ -type f ! -name "*.gz" -print0 |
        xargs -0 cat |
        sed -ne 's/^.\{20\}[^:]*://p' |
        sort |
        uniq -c |
        sort -n |
        tail -n 30
  ' | ssh -2 -l root devserver