сделать исполняемый скрипт bash программным

12

Мне нужно создать скрипт bash, чтобы создать и смонтировать диск. Итак, две простые команды. Оба «работают» при вводе в командной строке.

Сценарий создается и выполняется каждый раз, когда обычный пользователь входит в систему, поэтому мне нужен метод, чтобы сделать этот сценарий исполняемым в это время. Пока я не могу заставить это работать. Например, первая часть mkdir /vvv/ggggне продолжается, потому что скрипт не является исполняемым (я предполагаю).

Надеюсь, это имеет смысл. Это возможно? Любые мысли о том, как сделать эту работу, будут оценены.

Обновление :

Спасибо за ваши ответы. Я, вероятно, должен добавить некоторую дополнительную информацию, кроме того, что я новичок в Linux.

Я использую приложение с открытым исходным кодом виртуального рабочего стола под названием Ulteo. Это приложение работает поверх Ubuntu и имеет очень небольшую поддержку - вот почему я здесь. В основном я учусь на огне.

Итак, в приложении есть функция управления сценарием входа в систему, где я могу связать сценарий с пользователем. Простой Windows-скрипт с использованием сети прекрасно работает. Однако, когда я пытаюсь применить скрипт bash для Linux, ничего не происходит.

Я думаю, что из-за того, что мне нужно chmod +xсначала выполнить сценарий против сценария, чтобы сделать сценарий исполняемым, вот почему он терпит неудачу. Кстати, Ulteo работает в тюрьме chroot. Я создал скрипт, сохранил его и не смог найти скрипт. Я искал как внутри, так и снаружи тюрьмы.

Мне нравится подход dan08, чтобы исходный скрипт ссылался на другой скрипт, который я могу найти и сделать исполняемым вручную. Я столкнулся бы с той же самой проблемой?

Эта дополнительная информация проясняет ситуацию? Заранее спасибо.

Фотографии прилагаются.

! [консоль управления логином scipt] [1]

! [скрипты Windows, которые работают] [2]

! [простой скрипт Linux, который не работает] [3]

Извините, я пока не могу опубликовать изображения

Хилтон Динамика
источник
Собираетесь ли вы написать задание cron для запуска сценария при каждом входе пользователя в систему? Это руководство также должно помочь вам сделать их исполняемыми .
Бульбазавр, лишенный сна,
1
«Сценарий создается и выполняется каждый раз, когда нормальный пользователь входит» почему? Я бы это исправил, так как это звучит для меня нелогично. Я бы поставил скрипт пользователю в качестве параметра и оставил бы скрипт без изменений после его создания.
Rinzwind
1
В этом вопросе есть странная смесь времен, и я не могу понять, что происходит в настоящее время и что вы хотели бы от этого. Было бы полезно, если бы вы могли быть немного более конкретны в отношении текущей ситуации.
Оли
Пожалуйста, отредактируйте свой вопрос и покажите нам сценарий. Также покажите нам вывод ls -l scriptname. Вы также должны уточнить, как именно создается скрипт, и почему вы не просто создаете его один раз и оставляете его в покое. Наконец, ваш обычный пользователь не должен иметь права на запись в него /varи поэтому не сможет создавать там каталоги.
тердон
1
Разместите ссылки на изображения в комментариях. Мы импортируем их с помощью (предлагаемых) изменений.
Муру

Ответы:

19

Есть две вещи, которые вам нужно сделать:

  1. Ссылка на интерпретатор сценария в начале сценария:

    #!/bin/bash
  2. Установите разрешения, чтобы сделать его исполняемым:

    chmod +x myscript.sh
Эд Мане
источник
3

Вместо того, чтобы сделать ваш скрипт исполняемым, вы можете использовать другой подход и изменить способ вызова скрипта.

script.sh достаточно для запуска исполняемого скрипта.

тем не мение

Можно запустить невыполнимый скрипт, если указать программу для его запуска.

Так /bin/bash script.shили bash script.shили python script.pyвсе будут запускать неисполняемые сценарии.

Поэтому я предлагаю изменить способ вызова сценария и указать двоичный файл, используемый для его запуска.

Дэн
источник
Со своей стороны я обычно делаю их извиняемыми, потому что, если вы этого не сделаете, вы не сможете перезапустить файл из себя. Например, python os.execv(__file__, sys.argv)не будет работать, и наверняка есть и другие подобные ситуации. Если целью является безопасность, просто используйте ее из root / sudo, вместо этого позвольте пользователям запускать двоичные файлы. Кроме того, если целью является безопасность, вы не хотите, чтобы они могли запускать сценарии, потому что вы можете нанести вред системе в любом случае ... исполняемый или нет. Поэтому я не понимаю, почему важно избегать превращения их в исполняемые файлы.
m3nda
0

Создайте программу на C, C ++ или Python и т. Д. И используйте системную команду для выполнения сценария bash.

Например, программа на С будет выглядеть так:

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

Для запуска программы при запуске добавьте ее в список запускаемых программ. Откройте Startup Applications из вашего dash и добавьте скомпилированный исполняемый файл в список, нажав кнопку add.

akxer
источник
2
-1: Это не совсем ответ. Почему Python лучше, чем сценарий оболочки? Не говоря уже о C! В любом случае вы фактически не показываете, как будет выглядеть эта программа, и не объясняете, как добавить программу в список запускаемых программ.
тердон
Ответ на ваш первый вопрос можно дать, объяснив, чем язык программирования отличается от языка сценариев, а в остальном я отредактировал свой ответ
akxer
Спасибо за редактирование, -1 удалено. Однако использование программы на C для запуска сценария оболочки в Linux совершенно не нужно и добавляет ненужные накладные расходы. Почему бы просто не добавить сам скрипт в автозагрузку приложений? Или, если вы действительно хотите использовать C, почему бы не реализовать его напрямую? Создание оболочки в C, которая вызывает скрипт оболочки в Linux, вообще не имеет смысла, если только вам не нужно запускать скрипт с установленным битом SUID. Даже в этом случае обычно есть более простые решения.
Тердон
1
-1: все равно не получится, если скрипт не имеет прав на выполнение. Тебе придется позвонить bash path/yourbashscript.sh.
Муру
1
В связи с этим возникает вопрос: почему бы не запустить bash path/yourbashscript.shнапрямую вместо компиляции и запуска этой программы на C?
Муру
0

Вы можете сделать исполняемый скрипт bash запуском следующего в командной строке.

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

Затем выполнить его при запуске можно, добавив его в список запускаемых программ, как сказал @akabhirav.

LanceLafontaine
источник
Мне кажется, вопрос (несколько) показывает, что он знаком с тем, как chmod. Но он просит метод, чтобы сделать его исполняемым из самого скрипта (поэтому ему не нужно делать это вручную). Хотя я все еще подвергаю сомнению метод: воссоздание сценария на лету не способ сделать это.
Rinzwind
0

SHC - это универсальный компилятор сценариев оболочки. Он принимает скрипт, который указан в командной строке и создает исходный код на языке C. Сгенерированный исходный код затем компилируется и связывается для создания раздельного двоичного файла.

Скомпилированный двоичный файл все еще будет зависеть от оболочки, указанной в первой строке кода оболочки (shebang: #!/bin/shили что-то подобное), поэтому SHC не создает полностью независимые двоичные файлы.

Сама SHC не является компилятором типа cc. Скорее кодирует и шифрует сценарий оболочки и генерирует исходный код C с добавленной возможностью истечения срока действия. Затем он использует системный компилятор для компиляции раздвоенного двоичного файла, который ведет себя точно так же, как и оригинальный скрипт. После выполнения скомпилированный двоичный файл расшифрует и выполнит код с -cопцией оболочки .

Jhosman
источник
Какой смысл в этом, если для исполняемого файла все еще требуется исходная оболочка? Чем это лучше, чем просто добавить #!и chmod +x?
Xiota