【问题标题】:Getting an error EOF : Command no found when using ssh收到错误 EOF:使用 ssh 时找不到命令
【发布时间】:2018-12-02 01:23:31
【问题描述】:

我正在尝试重命名远程服务器中的文件名,例如 filename-dirname.suffix 并将文件复制到我的服务器。 我写过类似...的代码。

  #!/usr/bin/bash
  TRANSFERSERVERXMLS="/emp/transfer/XMLS"
  REMOTESERVERXMLS="remoteemp/empdir/XMLS"

  # renaming the filenames in remote server like filename-dirname.suffix  
  ssh abc@xyz REMOTESERVERXMLS=$REMOTESERVERXMLS 'bash -s'<< 'EOF'

  for i in $REMOTESERVERXMLS/* ; do 
     if [[ -d $i ]]; then
            dirname=$(basename $i)
                     for j in $REMOTESERVERXMLS/$dirname/* ; do

                               fname="$(basename "$j")"

                               prefix=$(echo $fname | awk -F "." 'NF{NF-=1};1')
                               suffix=$(echo $fname | awk -F "." '{print $NF}')

                               target=$prefix-$dirname.$suffix

                                mv $REMOTESERVERXMLS/$dirname/"$fname" $REMOTESERVERXMLS/$dirname/"${target// /_}"
                          done
    fi
  done
  EOF
 scp abc@xyz:${REMOTESERVERXMLS}/*/* ${TRANSFERSERVERXMLS}

出现错误:EOF:Command not found 并且 scp 不工作(无法复制到调用服务器)

【问题讨论】:

  • 顺便说一句,考虑通过shellcheck.net 运行您的代码(您需要单独传递heredoc 中的代码,因为从外部脚本的角度来看,它只是一个字符串文字)。跨度>
  • ...除了 heredoc 之外,您遇到的另一个问题是对传递的环境变量的依赖性,但我们还有其他问答条目,其中包含描述如何通过 ssh 可靠地传递变量的答案。 (printf -v transferservenrxmls_q %q "$transferserverxmls",然后"bash -s $transferserverxmls" 将从远程脚本的上下文中生成该值$1...如果我们知道远程用户的默认解释器是 bash;否则,事情会变得有点棘手)。跨度>
  • ...btw,注意这里使用了小写的变量名——见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…的第四段

标签: bash unix ssh sh scp


【解决方案1】:

在分隔符 EOF 之前有一个空格。不要在“此处文档”的末尾缩进 EOF。分隔符 (EOF) 必须是该行中唯一的内容,没有前导或尾随空格。

或者使用&lt;&lt;- 'EOF' 并使用制表符缩进。

【讨论】:

  • OP 也有一些问题,因为他们希望通过 ssh 传输环境变量,但这问题的根源。
  • @CharlesDuffy:说实话,当我看到标题时我就知道它会是什么,我没有看剩下的!我以为它会是重复的,但我仍在寻找。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2020-07-04
相关资源
最近更新 更多