尝试在linux中编译自己的shell时权限被拒绝,我该怎么办?

时间:2018-01-16 20:16:14

标签: c linux bash shell

我知道之前曾问过这个问题,但我已经尝试过使用chmod或sudo,但它仍然没有用。事情是这样的:

我在windows 10上安装的windows上使用ubuntu进行bash。我在终端编写了自己的shell,但是我做错了什么并且意外删除了几天的工作......所以我确定我已经开始在codeblocks中再次编写它并且只是复制了目录中的c文件,以便在我执行命令ls时可以看到该文件。

问题在于我尝试这样做:

gcc -o shell shell.c

我得到了

  

cc1:致命错误:shell.c:权限被拒绝

我该怎么办?

当我输入ls -ld . shell.c shell时,我得到:

drwxr-xr-x 0 Lightning Lightning   512 Jan 16 23:35 .
-rwxr-xr-x 1 root      root      19576 Jan 16 23:35 shell
---------- 1 Lightning Lightning 17310 Jan 16 23:35 shell.c

并澄清,因为很多人都明白我使用了sudo并且shell文件是问题所在。它不是! Sudo解决了我的问题(我知道它不是最好的解决方案,这也是我试图找到另一个的原因),但在使用sudo之前我遇到了问题。当我使用代码时:

 gcc shell.c

我仍然被许可拒绝了!

3 个答案:

答案 0 :(得分:2)

cc1: fatal error: permission denied

某些这是错误消息的确切文本吗?可能是这样吗?

cc1: fatal error: shell.c: permission denied

每个单词都在Unix风格的错误消息中计算。您所说的错误消息根本不会引用shell.c。它似乎报告了一个影响cc1的权限问题,这是编译器的内部组件,这就是为什么此答案的先前版本说"您的GCC安装被破坏"。但如果这是你的问题,你将无法编译任何,并且你说你可以编译除shell.c之外的其他东西。

另一方面,修改后的错误消息是cc1报告检测到的权限问题,但影响 shell.c,这是一致的声称只能编译shell.c,并且与您的ls输出一致:

---------- 1 Lightning Lightning 17310 Jan 16 23:35 shell.c

领先的破折号代表访问"模式" 000,这意味着" 任何人都无法读取,写入或执行,root除外。" (root许多权限之一就是它绕过了所有访问控制。)

如果这确实是您的问题,请运行命令

chmod 644 shell.c
sudo rm -f shell
来自包含shell.c的目录中的

应该使后续gcc shell.c -o shell工作。这些命令值得一些解释:chmod是用于更改访问权限的Unix命令。 chmod 644将权限设置为-rw-r--r--(由拥有用户读取和写入,所有其他用户只读),这几乎总是普通文件的正确权限集。 (您也可以说chmod u=rw,go=r shell.c,但是一旦您对它们进行了一些练习,您会发现八进制权限更容易阅读和写入!)删除shell也是必要的,因为root,因为当前root拥有该文件,并且不允许以普通用户身份运行的编译器覆盖它。

剩下的问题是:你的shell.c首先将其模式设置为000怎么样?这是一件非常奇怪的事情。我最好的猜测是你的#34;代码块"编辑器是一个原生的Windows程序,而不是Ubuntu-for-Windows程序,它不能与嵌套的Unix环境正常交互,但还有其他几种可能性,我不认为我可以帮助你进一步

答案 1 :(得分:0)

更新:我的回答是基于不完整的信息。我相信zwol's answer是正确的。

当你犯错误时:

sudo gcc -o shell shell.c

它创建了一个名为shell的可执行文件,由root拥有。当您在没有sudo命令的情况下再次尝试时:

gcc -o shell shell.c

它尝试覆盖shell可执行文件,但由于您无权破坏root拥有的文件,因此失败了。 (权限比这更复杂,但这是一般的想法。)

不要使用sudo进行编译。一般情况下,请勿使用sudo或任何类型的root访问权限执行root帐户实际上不需要执行的任何操作。 (您可能需要使用sudo 安装某些内容到主目录树之外的位置。)

答案 2 :(得分:0)

在给定-o shell命令行选项的情况下,您指示希望gcc将构建的输出存储在名为shell的文件中。从您的目录列表中,此文件归owner.group组合root.root所有,只有用户root具有该文件的写入权限。

假设您以用户gcc({1}}的所有者)的身份运行Lightning,则错误消息可以理解:shell.c无权覆盖您指定的输出文件。

作为一种变通方法,您应该能够通过gcc指定其他输出文件,例如shell2,并且应该生成可执行文件gcc -o shell2 shell.c

如果您真的希望将可执行文件命名为shell2,那么长期解决方案是删除文件shell或更改其权限,以便其他用户可以写入shell );必须以用户chmod 777 shell执行这些操作中的任何一个。