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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Shell 将所有*.gz文件推送到aws s3存储桶时出错-“;bash:-c:0行:意外标记“then'&引用;_Shell_Amazon S3 - Fatal编程技术网

Shell 将所有*.gz文件推送到aws s3存储桶时出错-“;bash:-c:0行:意外标记“then'&引用;

Shell 将所有*.gz文件推送到aws s3存储桶时出错-“;bash:-c:0行:意外标记“then'&引用;,shell,amazon-s3,Shell,Amazon S3,我试图将所有*.gz文件推送到aws s3存储桶,但我收到了以下错误bash:-c:line 0:意外标记附近的语法错误'then' ssh root@“find/tmp/-name”localhost_*.gz“-mtime-1-exec s3cmd 将“{}”放在s3://script testing/test1/\;如果[$?==“0”];则回显 \“成功将备份推送到s3 bucket\”| mail-s \“已成功将备份推送到S3\”电子邮件id;“else echo\”失败 将日志推送

我试图将所有*.gz文件推送到aws s3存储桶,但我收到了以下错误bash:-c:line 0:意外标记附近的语法错误'then'

ssh root@“find/tmp/-name”localhost_*.gz“-mtime-1-exec s3cmd 将“{}”放在s3://script testing/test1/\;如果[$?==“0”];则回显 \“成功将备份推送到s3 bucket\”| mail-s \“已成功将备份推送到S3\”电子邮件id;“else echo\”失败 将日志推送到S3存储桶\“邮件-s\”无法将日志推送到S3\” 电子邮件id;fi“

将-exec命令放入一个单独的shell脚本中会更简单(更清晰),这样就不必转义引号等,也不必问以下问题:

remote$ cat myscript.sh
s3cmd put "$1" s3://script-testing/test1/

if [ $? == "0" ] ; then
  ...


local$ ssh ... -exec myscript.sh '{}' \;
尽管如此:

  • 您的双引号不正确,但这可能是格式化或剪切/粘贴ism,尽管:

  • 您的整个命令应该使用单引号而不是双引号,尽管这会改变您转义的需要

  • 对“localhost_*.gz”使用单引号-否则,如果当前目录中恰好有与该模式匹配的文件,则会发生不好的事情。如果您遵守步骤2,则需要避开这些引用

  • 您需要在-exec命令中转义分号(除非将整批代码放入脚本中)

  • 严格地说,您应该双引号$?,但不需要引用“0”,但在本例中这不会导致任何问题

  • #3.你的问题的直接原因是什么;不是转义的,所以按字面意思理解,然后bash尝试将“then”作为shell命令运行,这显然失败了

    如果您真的想将整个过程放到一个长命令中,那么我建议将其作为一个单独的shell脚本(“find…-exec my-script.sh'{}\;”其中my-script.sh是您当前的-exec命令),然后找出在find命令中内联传递该脚本需要什么样的引用/转义。

    这样会更简单(更清楚的是)将-exec命令放在一个单独的shell脚本中,这样就不必转义引号等,也不必问以下问题:

    remote$ cat myscript.sh
    s3cmd put "$1" s3://script-testing/test1/
    
    if [ $? == "0" ] ; then
      ...
    
    
    local$ ssh ... -exec myscript.sh '{}' \;
    
    尽管如此:

  • 您的双引号不正确,但这可能是格式化或剪切/粘贴ism,尽管:

  • 您的整个命令应该使用单引号而不是双引号,尽管这会改变您转义的需要

  • 对“localhost_*.gz”使用单引号-否则,如果当前目录中恰好有与该模式匹配的文件,则会发生不好的事情。如果遵守步骤2,则需要转义这些引号

  • 您需要在-exec命令中转义分号(除非将整批代码放入脚本中)

  • 严格地说,您应该双引号$?,但不需要引用“0”,但在本例中这不会导致任何问题

  • #但是,3是问题的直接原因;,不是转义的,因此从字面上看,bash然后尝试将“then”作为shell命令运行,这显然失败了

    如果您真的想将整个过程放到一个长命令中,那么我建议将其作为一个单独的shell脚本(“find…-exec my-script.sh'{}\;”其中my-script.sh是您当前的-exec命令),然后找出在find命令中内联传递该脚本需要什么样的引用/转义。

    这样会更简单(更清楚的是)将-exec命令放在一个单独的shell脚本中,这样就不必转义引号等,也不必问以下问题:

    remote$ cat myscript.sh
    s3cmd put "$1" s3://script-testing/test1/
    
    if [ $? == "0" ] ; then
      ...
    
    
    local$ ssh ... -exec myscript.sh '{}' \;
    
    尽管如此:

  • 您的双引号不正确,但这可能是格式化或剪切/粘贴ism,尽管:

  • 您的整个命令应该使用单引号而不是双引号,尽管这会改变您转义的需要

  • 对“localhost_*.gz”使用单引号-否则,如果当前目录中恰好有与该模式匹配的文件,则会发生不好的事情。如果遵守步骤2,则需要转义这些引号

  • 您需要在-exec命令中转义分号(除非将整批代码放入脚本中)

  • 严格地说,您应该双引号$?,但不需要引用“0”,但在本例中这不会导致任何问题

  • #但是,3是问题的直接原因;,不是转义的,因此从字面上看,bash然后尝试将“then”作为shell命令运行,这显然失败了

    如果您真的想将整个过程放到一个长命令中,那么我建议将其作为一个单独的shell脚本(“find…-exec my-script.sh'{}\;”其中my-script.sh是您当前的-exec命令),然后找出在find命令中内联传递该脚本需要什么样的引用/转义。

    这样会更简单(更清楚的是)将-exec命令放在一个单独的shell脚本中,这样就不必转义引号等,也不必问以下问题:

    remote$ cat myscript.sh
    s3cmd put "$1" s3://script-testing/test1/
    
    if [ $? == "0" ] ; then
      ...
    
    
    local$ ssh ... -exec myscript.sh '{}' \;
    
    尽管如此:

  • 您的双引号不正确,但这可能是格式化或剪切/粘贴ism,尽管:

  • 您的整个命令应该使用单引号而不是双引号,尽管这会改变您转义的需要

  • 对“localhost_*.gz”使用单引号-否则,如果当前目录中恰好有与该模式匹配的文件,则会发生不好的事情。如果遵守步骤2,则需要转义这些引号

  • 您需要在-exec命令中转义分号(除非将整批代码放入脚本中)

  • 严格地说,你应该加倍努力
    ssh root@host $'find /tmp/ -name \'localhost_*.gz\' -mtime -1 -exec s3cmd put \'{}\' s3://script-testing/test1/ \\;\n\nif [ $? == 0 ]\nthen \n  echo "Successfully pushed the backup to s3 bucket" | mail -s "Successfully pushed backup to S3 "\nelse \n  echo "Failed pushing logs to S3 Bucket" | mail -s "Failed Pushing logs to s3"\nfi'
    
    # I'm assuming for simplicity that there is no whitespace in any of the
    # files that find will match.
    find /tmp/ -name "localhost_*.gz" -mtime -1 | while read fame; do
        if s3cmd put "$fname" s3://script-testing/test1/; then
            msg="Successfully pushed the backup $fname to s3 bucket"
        else
            msg="Failed pushing the backup $fname to s3 bucket"
        fi
        echo "$msg"
     done | mail -s "Results of pushing backups to s3 bucket" email-id
    
    scp script.sh host:
    
    ssh root@host bash script.sh