LINUX.ORG.RU

2
Всего сообщений: 47

cannot execute: Permission denied при запуске визуальной новеллы

Добрый вечер. Arch linux. Скачал некоторую визуальную новеллу и запускаю:

sudo sh MGQ.sh

Этот файл размером в 78 строк и в 77 строке такое:

exec $RENPY_GDB "$LIB/$BASEFILE" $RENPY_PYARGS -EO "$BASE/$BASEFILE.py" "$@"

На этой строчке и «вылетает». Вот:

MGQ.sh: line 77: /home/jean/mgq-0.99AAAA.14-rus_with_fix/lib/linux-x86_64/MGQ: Permission denied
MGQ.sh: line 77: exec: /home/jean/mgq-0.99AAAA.14-rus_with_fix/lib/linux-x86_64/MGQ: cannot execute: Permission denied

Вообще, многое из содержимого директории linux-x86_64 через файловый менеджер если смотрю «подсвечено» с восклицательным знаком. Не очень понимаю, как с этим быть... На форуме новеллы такого нет. Помогите, пожалуйста.

 , , , ,

ihni ()

запуск программы в chroot

Как запустить программу в chroot, из которого недоступен исполняемый файл програмы(а также зависимые динамические библиотеки)?

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

 , ,

urquan ()

Удаление пустых папок

Имеется каталог со множеством файлов и папок, необходимо удалить файлы старше 15 дней + следом удалить пустые папки и подпапки. Сделал под это дело два скрипта и засунул в крон. Скрипт №1 отрабатывает, все ок. Но Скрипт №2 удаляет пустые папки только в родительском каталоге, а подпапки нет. Например, если в пустой папке родительского каталога есть еще одна пустая папка, то он ее пропускает. Что нужно указать в команде, чтобы удаление происходило рекурсивно?

Скрипт №1: find /common/«ОбщаяПапка»/ -type f -mtime +15 -exec rm {} ; Скрипт №2: find /common/«ОбщаяПапка»/ -type d -empty -exec rmdir {} ;

 , , ,

grraf ()

Как поместить в лог отфильтрованный stdout?

Привет гуру линукса.

Прошу совета, как в bash скрипте использовать собственный лог, который является отфильтрованным выводом скрипта?

Т.е. у меня есть переменная $LOG, и я хочу в неё записывать определенные события в ходе выполнения скрипта.

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

По учебнику это вроде делается так:

exec &>>$TEMP | grep «text»>>$LOG

Но не могу довести до ума, как же её правильно реализовать в скрипте?

 ,

dualCore ()

C++ как получить путь запущенного приложения?

использую c++17 c++20
имеется приложение, которое использует ресурсы используя относительные пути — как выяснить реальный путь в файловой системе до самого бинаря внутри кода?

апд
в общем найдено несколько способов:
1. только для систем с procfs — C++ как получить путь запущенного приложения? (комментарий)
2. по идее кроссплатформенный через sdl2 — C++ как получить путь запущенного приложения? (комментарий)
3. использовать метод нахождения используемый в which (определять является ли argv путем, если да то каким — относительным или абсолютным, если нет, то искать название бинарника по путям в env var PATH)

 , ,

safocl ()

Перенаправление вывода внутри exec

Задаются три параметра: расширение, название каталога и другое расширение. Нужно найти внутри каталога все файлы с заданным расширением и хвостовую часть файла записать в файл, название которого формируется так: «имя исходного файла.третий параметр». Вот кусок кода:

find ./$2 -name «*.$1» -exec tail {} >> «{}.$3» ;

Вместо того, чтобы имена найденных файлов подставлять в {}.$3, он создает файл с именем {}.«$3», и записывает все туда. Что здесь нужно переписать, чтобы работало как надо?

 , ,

JoannaDevis ()

find и scp

Всем привет. Нужна помощь в решении задачки, нужно найти папку с определённым названием и копировать её на другой сервер со всеми файлами при этом сохранив еще две папки на 2-а уровня выше.

Попробовал сделать вот так но результат не тот что нужен find -name «24.11.2020» -exec scp -rpC {} root@terminal.gmi.ru:/home/test_q/ \;

Если искать find -name «24.11.2020» выдаёт полный путь до папки home/test/test_a/24.11.2020, далее запускается scp и на удалённом сервере создаёт папку 24.11.2020 и выкладывает туда все файлы и папки из исходных папок 24.11.2020 и при каждом копировании запрашивает пароль.

А нужно чтобы при выполнении команды на удаленном сервере в папке test_q создавалась отдельная папка с путём на 2-а уровня выше, то есть test_q/test/test_a/24.11.2020 далее test_q/test/test_b/24.11.2020, и так по найденному списку с копированием всех вложений и папок, при этом не вводить пароль на каждый файл из списка.

Подскажите как можно подправить команду.

 , ,

supp0rtmail2019 ()

Запустить fork в интерактивном режиме

Нужно из программы запустить редактор с аргументами. Код (без обработки ошибок) такой:

if ((editor_pid = fork ()) == 0) {
    editor = getenv ("EDITOR");
    editor = strdup (editor);
    execlp (editor, editor, file_name, (char*)0);
}
waitpid (editor_pid, &editor_status, 0);

Проблема: некоторые редакторы (проверил nano и vi) отказываются выполняться, потому что запущены не в интерактивном режиме, выдавая следующие ошибки:

vi:

[Using open mode]

Open and visual must be used interactively

nano:

Too many errors from stdin

Самое досадное то, что мой привычный vis работает нормально.

Так вот, собственно, как запустить editor в интерактивном режиме?

 , , , ,

Siborgium ()

Как вызвать exec* без утечки памяти?

Когда вызывается функция семейства exec, то параметры копируются в память нового процесса, который замещает текущий без возможности возврата.

Соответственно, если параметры выделены на куче - формально происходит утечка памяти (still reachable в формулировке valgrind). Да, система заберет память назад по завершению процесса (флаг on close). Но ведь формально это неправильно.

Речь про случай, когда мы делаем fork перед exec.

Если выделять на стеке - то тогда есть жесткое ограничение на размер аргументов (плюс стек не резиновый, команда формально может быть до 3.5 Гб длиной, а стек всего метр-4).

Или может можно как-то по другому выделить?

 ,

PPP328 ()

fork/exec + io redirect в файл — как правильно? (и/или как сделано в bash?)

По поводу пайпов между дочерними процессами на SO полно всякого разного: e.g. тыц, туц, тут – and I’m good.

А вот если я хочу stdout подпроцесса – в файл (или stderr в файл, или stdin из файла)? Видится мне два варианта:

  1. В дочернем процессе, между fork() и exec() открыть файл и dup2() его в STDOUT (STDERR, STDIN). Ещё не добрался попробовать, будет ли это работать в принципе. И тут с ходу виден ещё один косяк: если exec()-нутая программа тоже создаст подпроцесс, то FD туда пробросится (я ж не могу его открыть O_CLOEXEC прямо перед вызовом exec()? или могу потому что dup2 в STD…?) и непонятно как оно там себя потом будет вести (pipe read end например не отдаст EOF пока не будут закрыты все FD).

  2. В родительском процессе открывать файл и вручную (через epoll API) перекачивать из него данные в pipe. Чёрт с ним с геморроем, у меня уже есть работающий epoll loop. Но тут не запустить дочерний процесс асинхронно: родитель не может завершиться, не дождавшись завершения детей.

Собсна, сабж.

 , ,

dimgel ()

Как сделать, чтобы .exe был ассоциирован с wine, и по клику на exe в Dolphin автоматом подтягивался wine?

Установлен Debian 10.2 с KDE. В гугле есть рецепт с ubuntu-tweak, но есть проблема с сей утилитой.

sudo add-apt-repository ppa:tualatrix/ppa
выдаёт в конце

E: Репозиторий «http://ppa.launchpad.net/tualatrix/ppa/ubuntu focal Release» не содержит файла Release.

N: Обновление из этого репозитория нельзя выполнить безопасным способом, поэтому по умолчанию он отключён.

N: Информацию о создании репозитория и настройках пользователя смотрите в справочной странице apt-secure(8).

Посоветуйте, плз, как быть.

 , , , ,

tiinn ()

дублирование вывода stderr скрипта в файл

Как продублировать stderr скрипта в файл?

 , ,

teod0r ()

Бинд chvt в i3wm

Нужно чтобы при нажатии комбинации в i3wm происходило переключение на tty1. Как я понял, команды в i3wm запускаются только через exec, но тогда chvt просто не срабатывает. Есть решение?

Да, ctrl+alt+F1 не катит, хочется что-нибудь на подобии alt+tab.

 , , ,

stripwire ()

pipe()+exec()

Помогите, пожалуйста, разобраться. Есть программа, где используются вызовы fork() и pipe(). В процессе-родителе записывается информация в дескриптор fd[1], а в процессе-ребенке читается дескриптор fd[0] и выводятся эти данные на экран. Все это написано в одном файле. А у меня задача, чтобы в процессе-ребенке вызвался вызов exec() и оттуда как-то прочиталась информация, которую мы записали в процессе-родителе в дескрипторе fd[1]. Проблема в том, что в exec() мы же передаем файл, а в этом файле я не могу получить доступ к тем дескрипторам, которые были созданы в первоначальном файле. Помогите, разобраться с этим заданием. Много времени уже не могу разобраться. Вот собственно код, который нужно поменять:

#include <sys/types.h> #include <unistd.h> #include <stdio.h>

int main(){

int fd[2], result;

size_t size;

char resstring[14];

if(pipe(fd) < 0){

printf(«Can\'t create pipe\n»);

exit(-1);

}

result = fork();

if(result <0){ //ошибка создания

printf(«Can\'t fork child\n»);

exit(-1);

} else

if (result > 0) { //родительский процесс

close(fd[0]);

size = write(fd[1], «Hello, world!», 14)

if(size != 14){

printf(«Can\'t write all string\n»);

exit(-1);

}

close(fd[1]);

printf(«Parent exit\n»);

} else { //процесс ребенок close(fd[1]);

size = read(fd[0], resstring, 14);

if(size < 0){

printf(«Can\'t read string\n»);

exit(-1);

} printf(«%s\n»,resstring);

close(fd[0]);

}

return 0;

}

А вот задание: Модифицировать программу так, чтобы канал использовался для связи двух родственных процессов, исполняющих разные программы. Обратить внимание, на то, что процесс ребенок должен читать информацию из канала после замены его пользовательского контекста.

 , , , ,

Roman456 ()

Ищу гайдлайн по специфицированию параметров командной строки

Что, если нужно передать в программу одно значение? Что если значение из фиксированного множества? А если нужно передать массив (чисел или строк)? Какими символами всё это разделяют обычно в командной строке (минусы? точки? двоеточия? знак равенства как в -DAAA=BBB?) и что почитать по этому поводу.

читал то-сё:
POSIX - http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_1...
GNU - https://www.gnu.org/prep/standards/html_node/Command_002dLine-Interfaces.html
https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html

И как-то я не вдохновлён полнотой описания и наличием примеров/сценариев использования.

 , ,

Einstok_Fair ()

Аналог winapi CreateProcess под Linux

Привет всем!

Виндовый CreateProcess работает следующим образом:

1) Запускается родительский процесс 2) Запускается дочерний процесс 3) Далее завершение процессов:

3-a) если родитель умирает , ребенок продолжает работать

3-b) если ребенок умирает , родитель получает код завершения работы ребенка

Что я смог нарыть под Linux:

если

fork + exec , то выполняется только пункт 3-b

если

fork + fork + exec , то выполняется только пункт 3-a

Можно ли сделать так , чтобы выполнялись оба пункта (3-a и 3-b)?

 ,

morm ()

ntfs - имитация прав доступа на выполнение

Имеется раздел ntfs. Можно ли как-то на нем сымитировать права доступа на выполнение? Монтирую ntfs со свойствами:

fmask=133,gid=1000,uid=1000
т.е. даю себе права файлы и все они не выполняемые.

Теперь клонирую какой-нить репозиторий из git или mercurial и права на запуск некоторых файлов из него конечно пропадают... Так вот, есть какой-нить костыль (или не костыль), который позволит выполнить chmod +x file и запоминать это на разделе ntfs?

Не спрашивайте, почему ntfs, нафига ntfs... и так понятно, что зря ntfs, но вот ситуация...

 , ,

fguest ()

Как в QMainWindow поймать момент после старта QApplication.exec()

Обнаружил в Qt такую проблему. Есть обычное главное окно программы:

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
  MainWindow();
  ~MainWindow();

  void restoreWindowGeometry(void);
}

void MainWindow::restoreWindowGeometry(void)
{
  restoreGeometry( Тут_байты_с_геометрией );
}

Если вызывать метод восстановления геометрии окна restoreGeometry() до старта основного цикла приложения, например так:
int main(int argc, char ** argv)
{
 MainWindow win;
 win.restoreWindowGeometry();

 return app.exec();
}

То в некоторых оконных средах, например в OpenBox+LXDE, положение окна восстанавливается со смещением на размер заголовка окна и толщины обрамления. (В KDE4 и Gnome2, кстати, этой проблемы нет).

Если же вызвать restoreGeometry() после того, как основной цикл запущен, то восстановление геометрии происходит правильно.

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

Пока я вижу только громоздкую конструкцию:

1. Сделать промежуточный класс, унаследованный от QApplication, и в методе exec() выставлять флаг что основной цикл запущен. Сделать в этом классе метод isRunning(), возвращающий этот флаг.
2. В классе MainWindow сделать таймер с минимальной задержкой, который будет крутиться до того момента, пока isRunning() приложения не вернет true. И тогда сделать вызов restoreGeometry().

Но как-то это очень громоздко. Может быть можно воспользоваться каким-нибудь сигналом у QApplication или у QMainWindow, которые среботают после запуска основного цикла? Но только я таких сигналов не нашел.

 , , , ,

Xintrea ()

Как определить, запущен ли основной цикл QApplication::exec() или еще нет?

Потребовалось мне тут совершать разные действия в зависимости от того, запущен ли экземпляр Qt-приложения или еще нет.

У класса QApplication есть метод exec(), но нет метода типа isRunning().

По какому признаку можно понять, что объект приложения создан и запущен?

 , ,

Xintrea ()

Выполнить команду при входе по SSH

Шалом, котаны!

Есть такая потребность: при входе по SSH необходимо выполнить команду от имени суперпользователя. suid, .profile и .login не катят. Необходимо реализовать это средствами sshd.

Есть идеи?

Заранее благодарю за ответы.

 , ,

IPR ()