【问题标题】:Bash script rm command failed in while loopBash 脚本 rm 命令在 while 循环中失败
【发布时间】:2019-12-19 12:27:35
【问题描述】:

我有一个带有几个缓存键的远程服务器,我正在尝试删除它们。但是,我在运行脚本时遇到错误。

这是我目前正在使用的脚本。另外,我设置了公共 ssh 密钥,因此我不必输入密码:

input="path to file"
while IFS= read -r line; do
    ssh  -tt user@192.168.20.59 "sudo -S rm $line"
done < "$input"

如果我尝试循环外的 ssh 命令将按预期工作。我不知道为什么循环会影响命令

我得到的错误是:

No such file or directory3f971a5e192fb9332c764a636a4205f
connection to 192.168.20.59 closed.

提前谢谢你

注意: 通过修改生成文件的脚本修复了该问题。出于某种原因,在行尾添加了 ^M。我使用 echo & cat 生成文件并避免外来字符

【问题讨论】:

  • 报错中“目录”后面真的没有空格吗?
  • 与错误无关,但循环只会处理文件的第一行。对ssh 使用-n 选项。见stackoverflow.com/questions/9393038/…
  • 您如何回答sudo 密码提示,因为输入是从文件重定向的?
  • @andregr_jp:拿起Barmar的第一条评论:难道$input包含回车符?
  • @JoaoVitorino 这是针对另一个问题的解决方案,OP 声称他没有(但我不知道为什么)。这是我链接到的另一个副本。

标签: bash ssh while-loop rm


【解决方案1】:

通过修改生成文件的脚本解决了这个问题。出于某种原因,在行尾添加了 ^M。我使用 echo & cat 生成文件并避免外来字符

【讨论】:

    【解决方案2】:

    试试下面的

    input="path to file" 
    for line in `cat $input`; do 
        ssh -tt user@192.168.20.59 "sudo -S rm '$line'" 
    done 
    

    更新:感谢@Barmar 指出它不适用于文件名中的特殊字符。变量 $line 周围的单引号解决了这个问题。

    【讨论】:

    • @tripleeeI 但我测试了这段代码,它可以为我工作多年。
    • 直到您的文件包含空格或 shell 元字符。点击链接;这就是我提供它的原因。
    • @tripleee 我阅读了您的链接在此文件中,案例文件包含文件名,并且没有任何“for”陷阱适用。
    • 您认为 OP 存在什么问题,如何解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2020-05-02
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2019-05-06
    • 2014-11-03
    相关资源
    最近更新 更多