【问题标题】:SSH in Bash Script Messing Up File Read [duplicate]Bash 脚本中的 SSH 混淆文件读取 [重复]
【发布时间】:2011-07-05 15:24:28
【问题描述】:

我有一个脚本可以逐行读取文件并根据它读取的内容执行操作。它所做的其中一件事是通过 ssh 连接到远程服务器并获取一些信息。由于某种完全超出我能力范围的原因,这会停止从文件中读取行。

脚本本质上是(我已经删掉了很多以简化问题,所以如果它看起来并没有真正做任何事情,请不要担心):

cat $csv | while read line; do
   shopt -s nocasematch
   for j in "${file_list[@]}"; do
      found=0;
      for i in $(ssh some_server "ls /some_path/${line:0:1}/${line:1:1}/$line*"); do
         if [[ $i =~ .*$j$ ]]; then
            echo "do something";
            found=1;
            break;
         fi;
      done;
      if [[ $found -ne 1 ]]; then
         echo "don't have $j";
      fi;
      if [[ $found -ne 1 && $j == '\.pdf' ]]; then
         getPDF $line ${dest};
      fi;
   done;
   shopt -u nocasematch
done

这个脚本最终只在 csv 的第一行运行。如果我用其他任何东西替换脚本的“ssh”部分,它会在文件的所有行上一直运行。是什么赋予了?

【问题讨论】:

  • ssh 吃掉你的标准输入了吗(这里,你的useless use of cat 是标准输入)?试试 ssh -n 看看会发生什么...
  • 我强烈建议您在逐行读取文件时始终使用read -r,如果空格对您很重要,您可能需要while IFS=$'\n' read -r

标签: bash unix


【解决方案1】:

ssh 正在使用标准输入。通过-n.

【讨论】:

  • 做到了。谢谢!对于那些将来想要了解更多解释的人,请通过运行“man ssh”查找 -n 选项。该脚本的最终工作版本与上述相同,只是 ssh 部分显示为“ssh -n some_server...”
【解决方案2】:

如果您在循环内运行从标准输入(例如ssh)读取的命令,您需要确保:

  • 您的循环没有遍历标准输入
  • 您的命令已重定向其标准输入:

前者:

while read -u 5 -r; do
  ssh "$REPLY" ...
done 5<file

...使用 bash 4.1 或更高版本,可以使用自动文件描述符分配重写如下:

while read -u "$file_fd" -r; do
  ssh "$REPLY" ...
done {file_fd}<file

后者:

while read -r; do
  ssh "$REPLY" ... </dev/null
done <file

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 2014-10-26
    • 2013-03-07
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2017-07-02
    • 2019-08-03
    • 2018-05-31
    相关资源
    最近更新 更多