що робить bash-скрипт виконуваним програмно


12

Мені потрібно створити сценарій bash для створення та монтажу накопичувача. Отже, дві прості команди. Обидва "працюють", коли їх вводять у командному рядку.

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

Сподіваюся, це має сенс. Чи можливо це? Будь-які думки про те, як зробити цю роботу, будуть вдячні.

Оновлення :

Дякуємо за ваші відповіді. Я, мабуть, повинен додати якусь додаткову інформацію, окрім того, що я новачок у Linux.

Я використовую віртуальний настільний додаток з відкритим кодом під назвою Ulteo. Ця програма працює на вершині Ubuntu і має дуже малу підтримку - ось чому я тут. В основному я вчуся вогнем.

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

Я думаю, що, оскільки мені потрібно виконати chmod +xпроти сценарію спочатку, щоб зробити сценарій виконуваним, саме тому його збій. До речі, Ультео біжить у в'язниці Chroot. Я створив сценарій, зберег його і не зміг його знайти. Я шукав як усередині, так і поза в'язниці Chroot.

Мені подобається підхід dan08, щоб початковий посилання на сценарій інший сценарій, який я можу знайти та зробити виконуваним вручну. Чи зіткнувся б я з тією ж проблемою?

Чи пояснює ця додаткова інформація ситуацію? Заздалегідь спасибі.

Фотографії додаються.

! [консоль управління вхідним кодом] [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, а не дозволяйте користувачам запускати бінарні файли. Крім того, якщо мета - безпека, ви не хочете, щоб вони мали змогу виконувати сценарії, тому що ви можете завдати шкоди системі в будь-якому випадку ... виконується чи ні. Тому я не бачу, чому важливо уникати їх виконання.
м3нда

0

Створіть програму на C, C ++ або Python тощо та використовуйте системну команду для виконання скрипту 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 був би кращим за сценарій оболонки? Нехай тільки С! У будь-якому випадку ви насправді не показуєте, як виглядатиме ця програма, і ви не пояснюєте, як додати програму до списку програм запуску.
тердон

Відповідь на ваше перше запитання можна дати, пояснивши, чим мова програмування відрізняється від мови сценаріїв, а для решти я відредагував свою відповідь
akxer

Дякуємо за редагування, -1 видалено. Однак використання програми C для запуску сценарію оболонки на Linux абсолютно непотрібне і додає зайвих накладних витрат. Чому б просто не додати сам скрипт до запуску програм? Або, якщо ви дійсно хочете використовувати C, чому б не реалізувати його безпосередньо? Створювати обгортку на C, яка викликає скрипт оболонки під Linux, зовсім не має сенсу, якщо вам не потрібен запуск сценарію з набором бітів SUID. Навіть у такому випадку зазвичай є більш прості рішення.
тердон

1
-1: Це все одно не вдасться, якби сценарій не мав дозволу на виконання. Вам доведеться зателефонувати bash path/yourbashscript.sh.
муру

1
Виникає питання, чому б не запустити bash path/yourbashscript.shбезпосередньо замість того, щоб компілювати та запускати цю програму C?
muru

0

Ви можете зробити свій скрипт bash виконуваним, виконавши наступне в командному рядку.

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

Тоді зробити його виконаним при запуску можна, додавши його до списку запуску програм, як сказав @akabhirav.


Мені здається, що питання (дещо) показує, що він знайомий як chmod. Але він просить метод зробити його виконуваним зсередини самого сценарію (тому він не повинен робити це вручну). Хоча я все ще ставлю під сумнів метод: відтворення сценарію на льоту - це не спосіб зробити це.
Rinzwind

0

SHC - універсальний компілятор скриптів оболонки. Він займає сценарій, який задається в командному рядку і виробляє вихідний код C. Потім згенерований вихідний код компілюється та пов'язується для отримання зніманого двійкового коду.

Скомпільований двійковий файл все ще буде залежати від оболонки, зазначеної в першому рядку коду оболонки (shebang: #!/bin/shабо такий), таким чином SHC не створює повністю незалежних бінарних файлів.

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


Який сенс у цьому, якщо виконуваному файлу все ще потрібна початкова середовище оболонки? Чим це краще, ніж просто додавати #!і chmod +x?
xiota
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.