以编程方式使bash脚本可执行


12

我需要创建一个bash脚本来创建和安装驱动器。因此,有两个简单的命令。在命令行中输入时,两者都“有效”。

每次普通用户登录时都会创建并执行该脚本,因此我需要一种使该脚本在那时可执行的方法。到目前为止,我无法使它正常工作。例如,第一部分mkdir /vvv/gggg没有进行,因为脚本不可执行(我在猜测)。

希望这是有道理的。这可能吗?任何有关如何使这项工作的想法将不胜感激。

更新

感谢您的回复。除了我不熟悉Linux外,我可能还应该添加一些其他信息。

我正在使用一个名为Ulteo的开源虚拟桌面应用程序。该应用程序在Ubuntu之上运行,几乎没有支持-这就是为什么我在这里。基本上,我在学火。

因此,该应用程序具有登录脚本管理功能,可以在其中将脚本绑定到用户。具有网络使用权限的简单Windows脚本可以很好地工作。但是,当我尝试应用Linux bash脚本时,没有任何反应。

我在想,因为我需要chmod +x首先对脚本执行a 指令才能使脚本可执行,所以这就是失败的原因。顺便说一句,Ulteo在chroot监狱中运行。我创建了一个脚本,将其保存,但找不到该脚本。我在chroot监狱的内部和外部进行了搜索。

我喜欢dan08的方法,让初始脚本引用另一个我可以手动找到并使其可执行的脚本。我会遇到同样的问题吗?

这些附加信息是否可以澄清情况?提前致谢。

附有照片。

![登录密码管理控制台] [1]

![有效的Windows脚本] [2]

![无法使用的简单Linux脚本] [3]

抱歉,我还不能发布图片


您是否打算编写cron作业来在每次用户登录时运行脚本? 本指南也应帮助您使它们也可执行
睡眠被剥夺的Bulbasaur

1
为什么“每次普通用户登录时都会创建并执行脚本”,为什么?我会解决此问题,因为这对我来说听起来不合逻辑。我将脚本作为参数提供给用户,并在创建后保持脚本不变。
Rinzwind 2014年

1
问题中的时态混杂在一起,使我对当前发生的事情以及您希望执行的操作感到困惑。如果您可以更详细地了解当前情况,这将有所帮助。
奥利(Oli)

编辑您的问题并向我们显示脚本。同时向我们显示的输出ls -l scriptname。您还应该阐明脚本的创建方式,以及为什么不只创建一次而将其搁置一旁。最后,您的普通用户不应具有写权限,/var因此不能在此创建目录。
terdon 2014年

1
在评论中发布图片链接。我们将通过(建议)编辑将其导入。
muru 2014年

Answers:


19

您需要做两件事:

  1. 在脚本的开头引用脚本解释器:

    #!/bin/bash
  2. 设置权限以使其可执行:

    chmod +x myscript.sh

3

除了使脚本可执行之外,您可以采用其他方法并更改调用脚本的方式。

script.sh 足以运行可执行脚本。

然而

如果指定要运行的脚本,则可以运行不可执行的脚本。

所以/bin/bash script.shbash script.shpython script.py将全部运行非可执行的脚本。

因此,我的建议是编辑脚本的调用方式,并指定用于运行脚本的二进制文件。


在我这边,我通常使它们可执行,因为如果不这样做,就无法从自身重新启动文件。例如,python os.execv(__file__, sys.argv)无法工作,并且可以肯定还有更多类似情况。如果安全性是目标,那么只需在root / sudo中使用它即可,而是让用户运行二进制文件。同样,如果目标是安全性,则您不希望它们能够运行脚本,因为无论如何,它可能会损害系统...可执行文件与否。所以我不明白为什么避免使它们成为可执行文件很重要。
m3nda

0

用C,C ++或Python等创建程序,然后使用system命令执行bash脚本。

例如,C程序如下所示:

#include "stdio.h"
int main(int argc, char const *argv[])
{
    system('chmod +x path/yourbashscript.sh');
    system('path/yourbashscript.sh');
    return 0;
}

要在启动时执行程序,请将其添加到启动程序列表中。从破折号中打开“启动应用程序”,然后单击“添加”按钮将已编译的可执行文件添加到列表中。


2
-1:这不是真正的答案。为什么python比shell脚本更好?更何况C!无论如何,您实际上并没有显示该程序的外观,也没有在说明如何将程序添加到启动程序列表中。
terdon 2014年

第一个问题的答案可以通过解释编程语言与脚本语言之间的区别来解决,就像我编辑了答案的其余部分一样
akxer 2014年

感谢您的修改,删除了-1。但是,完全不需要使用C程序在Linux上启动Shell脚本,并且会增加不必要的开销。为什么不将脚本本身添加到启动应用程序中呢?或者,如果您真的想使用C,为什么不直接实现它呢?在C中创建一个在Linux下调用外壳程序脚本的包装程序根本没有任何意义,除非您需要在SUID位置1的情况下运行脚本。即使在那种情况下,通常也有更简单的解决方案。
terdon 2014年

1
-1:如果脚本没有执行权限,这仍然会失败。您必须打电话给bash path/yourbashscript.sh
muru 2014年

1
这就提出了一个问题,为什么不bash path/yourbashscript.sh直接运行而不是编译并运行此C程序?
muru 2014年

0

您可以通过在命令行中运行以下命令来使bash脚本可执行。

cd ~/path/to/file
chmod +x nameoffile.sh

然后,可以通过将其添加到启动程序列表中来使其在启动时执行,如@akabhirav所说。


在我看来,这个问题(某种程度上)表明他熟悉如何使用chmod。但是他正在寻求一种方法,使其可以从脚本本身内部执行(因此,他不必手动执行此操作)。尽管我仍然质疑该方法:动态创建脚本不是这样做的方法。
Rinzwind 2014年

0

SHC是通用Shell脚本编译器。它需要一个在命令行上指定的脚本,并生成C源代码。然后将生成的源代码编译并链接以生成剥离的二进制文件。

编译后的二进制文件仍将取决于外壳程序代码第一行中指定的外壳程序(shebang:#!/bin/sh或此类),因此SHC不会创建完全独立的二进制文件。

SHC本身不是诸如的编译器cc。而是对shell脚本进行编码和加密,并生成具有附加过期功能的C源代码。然后,它使用系统编译器来编译行为完全类似于原始脚本的剥离二进制文件。执行后,编译后的二进制文件将使用shell的-c选项解密并执行代码。


如果可执行文件仍然需要原始的shell环境,这有什么意义呢?与仅添加#!和相比,这有什么好处chmod +x
xiota
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.