首页 > 解决方案 > 我运行了一个我创建的 sh 脚本,但它失败了,因为它发现了不在脚本本身中的无效字符

问题描述

我创建了一个 sh 脚本,基本上它的作用是读取一个纯文本文件,其中是我想要发送公钥以连接到它们的服务器的 ip、用户和密码,而不需要密码来解决问题使用 ansible 和 vagrant 实现自动化。

#!/bin/sh
file="$1"
lines=$(cat $file)
file_tr=`cat $file | tr " " ","`
for line in $file_tr
do
    ip=`echo $line | cut -d "," -f1`
    user=`echo $line | cut -d "," -f2`
    pass=`echo $line | cut -d "," -f3`
    sshpass -p $pass ssh-copy-id -i ~/.ssh/id_rsa.pub -oStrictHostKeyChecking=no $user@$ip
done

我已经在 Ubuntu 20.04 中使用 Visual Studio 代码完成了这个脚本,并且我在上面运行它没有任何问题,也就是说,它运行良好。

后来我下载了我的存储库,这个脚本在 Windows 10 中,我用 Visual Studio 代码打开了存储库,然后用 Visual Studio 代码打开了一个带有 git bash 的终端,我做了 ssh 到一个 ubuntu 20.04 服务器,自动部署了 vagrant 和在此服务器上的文件夹共享存储库中,我运行了脚本,它检测到脚本本身中不存在的字符。正如我们在这里看到的。

vagrant@server1:~$ sh multi-copy-ssh-public-key.sh hosts0.txt 
cat: 'hosts0.txt'$'\r': No such file or directory
cat: 'hosts0.txt'$'\r': No such file or directory
multi-copy-ssh-public-key.sh: 6: Syntax error: word unexpected (expecting "do")

我在带有图形环境的 ubuntu 20.04 上做同样的过程,它没有给我任何错误。给我的这个错误没有任何意义,因为我在我编写的脚本中看不到这些字符。所以请有人向我解释一下,因为我越来越绝望,这是迄今为止我作为一名计算机科学家发生过的最奇怪的事情。

我已经完成了所有操作,例如将脚本复制并粘贴到记事本中,尝试删除一些字符,唯一的解决方案是再次重写脚本,完全相同并且可以正常工作。我只想知道为什么这件奇怪的事情会发生在我身上。

标签: linuxbash

解决方案


推荐阅读