我知道之前曾问过这个问题,但我已经尝试过使用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
我仍然被许可拒绝了!
答案 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
执行这些操作中的任何一个。