Ubuntu говорит: «bash: ./program В доступе отказано» [закрыто]

207

Я запускаю Ubuntu на компьютере 1 и компьютере 2. Я скомпилировал программу C ++ на компьютере 1, и я могу выполнить ее с терминала, используя ./program_name. Работает нормально.

Однако, когда я пытаюсь сделать это на компьютере 2, он говорит: bash: ./program_name: permission denied

Что не так и что я могу с этим сделать?

Киан
источник
7
У вас есть разрешения на выполнение progam_name?
Федорки "ТАК прекратить вредить"
1
Как вы получили программу с компьютера 1 на компьютер 2? Вы скопировали исполняемый файл или перекомпилировали исходный код? Что выводится командой «ls -l program_name»?
Эрик Постпишил
2
Похоже, что это не тема для SO, потому что речь идет не о программировании, а об управлении правами в Linux
nijansen
4
попробуйтеbash program_name
Наджиб Мами,
10
Я написал .shфайл. Он отказался выполнить с этим сообщением об ошибке. Я бы сказал, что это определенно актуально для StackOverflow. Я номинирован на повторное открытие.
ArtOfWarfare

Ответы:

392

chmod u+x program_name, Тогда выполните это.

Если это не помогает, скопируйте программу с устройства USB на собственный том системы. затемchmod u+x program_name на локальной копии и выполните это.

Unix и Unix-подобные системы, как правило, не будут выполнять программу, если она не помечена с разрешением на выполнение. То, как вы скопировали файл из одной системы в другую (или подключили внешний том), возможно, отключило разрешение на выполнение (в качестве функции безопасности). Команда chmod u+x nameдобавляет разрешение для пользователя, которому принадлежит файл, на его выполнение.

Эта команда только изменяет разрешения, связанные с файлом; это не меняет элементы управления безопасностью, связанные со всем томом. Если элементы управления для тома мешают выполнению (например, noexecдля тома в fstabфайле Unix может быть указана опция , которая запрещает разрешение на выполнение для файлов тома), вы можете перемонтировать том. с вариантами, чтобы разрешить выполнение. Однако копирование файла на локальный том может быть более быстрым и простым решением.

Эрик Постпищил
источник
3
Раньше я думал, что это будет происходить только на нативных разделах Unix / Linux, таких как FAT32, и не произойдет /tmp. Оказывается, моя tmpfs /tmpстрадает той же проблемой, и мне приходится копировать исполняемый файл в реальный собственный том, то есть в мою домашнюю папку ~ в разделе ext4.
RayLuo
13
Я столкнулся с этой проблемой сегодня, поэтому я STFW, первый результат поиска в фиолетовый цвет, что означает, что я читал это раньше. «Это многообещающий знак», - сказал я себе и затем щелкнул по этому результату поиска. Это привело меня на эту страницу, этот ответ, который не работает в моем случае, и, наконец, комментарий выше, который работает. И тогда я замечаю, что этот комментарий был написан мной 2 месяца назад. Вау, что за жизнь.
RayLuo
5
Извините за совладание с этим Q / A ... пожалуйста, подумайте также, что, возможно, noexec находится в fstab, который монтирует диск без каких-либо привилегий на выполнение ... "Я слышал", что "некоторые люди" потеряли немало времени в поисках этого. ..
Саймон
1
@Webman: chmodделает длительные изменения. Если разрешения меняются после того, как вы их используете chmod, то что-то еще меняет их. (Это может включать в себя что-то еще, удаляющее файл и воссоздающее его, или том, на котором файл монтируется и монтируется. Если том перемонтируется, существуют способы указать разрешения по умолчанию для файлов на внешних томах, но это выходит за рамки Я могу ответить сейчас.)
Эрик Постпишил
2
@SimonOpelt "другие люди" благодарны
Мэтт Якобсен
32

Попробуй это:

sudo chmod +x program_name
./program_name 
Vitor Villar
источник
Спасибо за ваш совет. Я только что попробовал это - но теперь он говорит, что bash: ./program_name не может выполнить двоичный файл
Kian
Может ли это быть потому, что компьютер 2 является 32-разрядным, а компьютер 1 - 64-разрядным? Я думаю, может быть, я должен просто скомпилировать его на компьютере 2. Спасибо за вашу помощь всем.
Киан
Да, если вы компилируете какую-либо программу в 64-битной среде и пытаетесь выполнить в системе 32-битную систему, это не работает. вам нужно перекомпилировать исходный код на компьютере 2.
Vitor Villar
sudoкак правило, не требуется, если только программа не находится в каталоге, где у вас нет разрешения на запись (в каком случае, как вы установили его там в первую очередь?)
tripleee
10

Похоже, у вас не установлен флаг выполнения в правах доступа к файлу, попробуйте:

chmod u+x program_name
Сэм Робертс
источник