为什么这个Bash脚本在一台机器上运行但在另一台机器上运行?

时间:2014-09-29 15:09:17

标签: linux bash

我编写了一个程序,需要访问我主板的I / O端口才能获得root权限。我想在系统启动时运行这个程序,但由于Ubuntu系统启动无法运行具有root权限的应用程序,我编写了这两个简单的文件:

askpass.sh

export SUDO_ASKPASS="/var/www/Bash/mits/getpass.sh"; 
sudo -A -E /home/mits/QtProjects/HandST/HandST // this is the address of my application

getpass.sh

echo 'P54_99**'    //this is my password

因为它出现在askpass.sh文件中,我使用了sudo手册中所述的 SUDO_ASKPASS 来运行我的应用程序,其中包含位于其他文件中的sudo密码。

当我在我的笔记本电脑中调用askpass.sh它工作正常并且应用程序将启动,但是当我在我办公室的PC服务器中运行此脚本时,它会出现以下错误。(我使用远程访问来访问我的服务器)

./askpass.sh
**./askpass.sh: line 5: $'\r': command not found**
sudo: unable to run /var/www/Bash/mits/getpass.sh: Exec format error
Sorry, try again.
sudo: unable to run /var/www/Bash/mits/getpass.sh: Exec format error
Sorry, try again.
sudo: unable to run /var/www/Bash/mits/getpass.sh: Exec format error
Sorry, try again.
sudo: 3 incorrect password attempts

这是什么' \ r'变量(我的代码中没有这样的东西!在文件的末尾或类似的东西看起来像\ n!)!这两个文件与我的笔记本电脑文件完全相同,只更改了服务器的路径和密码,但为什么它无法在我的服务器上运行?我确信密码被修改为服务器密码,我测试了很多次。但我也不知道为什么它也会给密码带来错误:(

我还尝试将我的应用程序路径放在以root权限运行的rc.local中,但它也失败了。

我只想尝试这个作为解决方案,所以我很乐意为这种类型的启动处理提出解决方案。

提前感谢。

2 个答案:

答案 0 :(得分:3)

您似乎在shell脚本中嵌入了Windows行结尾(\r\n),您可以在文件上运行命令dos2unix,并且应该修复它。如果您没有dos2unix,则可以使用tr之类的内容,

tr -d '\r' < askpass.sh > out.sh

然后

mv out.sh askpass.sh

答案 1 :(得分:1)

尝试将此添加为您脚本的第一行

#!/bin/bash

也许你在其他机器上设置了不同的shell。请尝试运行

进行检查
env | grep SHELL