execl и cmd1 | cmd2

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-11 14:25:52

Добрый день.
Друзья, можно ли каким-либо способом выполнить конструкцию, например
echo "pass" | pw usermod -u 1005 -h 0
средствами системного вызова execl ?

Самостоятельно разобраться в данном вопросе не получилось.

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

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <unistd.h>


int main()
{
 int fds[2];
 pid_t pid;
 if(pipe(fds)<0)
 { 
  perror("pipe failed"); 
  exit(1); 
 }
 if((pid=fork())<0)
 { 
  perror("fork failed"); 
  exit(2); 
 }
 if(pid==0)
 { 
  close(fds[1]); 
  dup2(fds[0], 0); 
  execl("/usr/sbin/pw", "pw","usermod","-u","1005","-h","0", NULL);
  perror("failed to run pw");
 }
 else
 { 
  close(fds[0]);
  dup2(fds[1], 1); 
  execl("/bin/echo", "echo","zxcv", NULL);
  perror("failed to run echo");
 }
 exit(0);
}

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35145
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: execl и cmd1 | cmd2

Непрочитанное сообщение Alex Keda » 2008-08-11 19:22:35

э... а программа делает не тоже самое? и не также ли?
=========
Я не программер на сях, поэтому такие вопросы в аську - несколько странно.
это к тому что я не ответил. вопрос видел, но ответить не успел - оторвали =)
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-11 21:09:07

SergeyJ2 писал(а):Друзья, можно ли каким-либо способом выполнить конструкцию, например
echo "pass" | pw usermod -u 1005 -h 0
man echo
конвеер, как и echo, прерогатива шелла, а не системной команды. Но никто не запрещает делать перенаправления стандартными средствами С через popen(3). Либо указывать конвеер прямо в команде вызова execl, потому как она вызывает шелл Судя по ману. :smile:
Последний раз редактировалось zg 2008-08-11 21:19:21, всего редактировалось 1 раз.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: execl и cmd1 | cmd2

Непрочитанное сообщение hizel » 2008-08-11 21:15:15

что то мне подсказывает, что писать на Си как на shell несовсем идеологически верно? :)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-11 21:22:26

hizel писал(а):что то мне подсказывает, что писать на Си как на shell несовсем идеологически верно? :)
да нормально :good: исходники подправил и вперёд :-D зато на парсинге будет зверская экономия

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-12 6:56:33

lissyara писал(а):э... а программа делает не тоже самое? и не также ли?
=========
Я не программер на сях, поэтому такие вопросы в аську - несколько странно.
это к тому что я не ответил. вопрос видел, но ответить не успел - оторвали =)
Да, действия одинаковые. Но была необходимость делать это все именно из программы.

Да, всякое бывает :)

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-12 7:01:11

zg писал(а):
SergeyJ2 писал(а):Друзья, можно ли каким-либо способом выполнить конструкцию, например
echo "pass" | pw usermod -u 1005 -h 0
man echo
конвеер, как и echo, прерогатива шелла, а не системной команды. Но никто не запрещает делать перенаправления стандартными средствами С через popen(3). Либо указывать конвеер прямо в команде вызова execl, потому как она вызывает шелл Судя по ману. :smile:
немноо переделал:
заменил:

Код: Выделить всё

  close(fds[0]);
  dup2(fds[1], 1);
  execl("/bin/echo", "echo","zxcv", NULL);
  perror("failed to run ls");
на:

Код: Выделить всё

write(fds[1], "12345", 5);
А вот выполнить все это в одном execl не молучалось.
если указать так:
execl("/bin/echo","echo","text","|","/usr/sbin/pw","usershow","test",NULL);
То на консоль выведет:
text | /usr/sbin/pw usershow test

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-12 7:04:08

hizel писал(а):что то мне подсказывает, что писать на Си как на shell несовсем идеологически верно? :)
Я с вами согласен в этом.

Был такой вариант решения:
Парсить passwd, вставлять в него новый пароль, но потом все равно прибегать к вызову комманды pw_mkdb.

Может быть есть другой способ работы с пользователями? API?

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: execl и cmd1 | cmd2

Непрочитанное сообщение hizel » 2008-08-12 8:24:19

складываю 2 и 2 получаю:

Код: Выделить всё

user@host /usr/src/usr.bin/passwd >vim passwd.c
;)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-12 11:38:00

hizel писал(а):складываю 2 и 2 получаю:

Код: Выделить всё

user@host /usr/src/usr.bin/passwd >vim passwd.c
;)
Но разве функция pam_chauthtok() просто не запросит сменить ключ аутентификаци для юзера?
Ну то есть все-равно же попросит ввести пароль, повторить пароль.
Или ошибаюсь?

А в моем случае, все должно происходить тихо, мирно:
myprog USERNAME PASSWORD

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: execl и cmd1 | cmd2

Непрочитанное сообщение paradox » 2008-08-12 17:49:57

озвучте полную задачу
а не угадывайте пути ее решения

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-13 6:58:29

paradox писал(а):озвучте полную задачу
а не угадывайте пути ее решения
Задача такая: создавать, менять пароль того или иного пользователя средствами самописной программы.
На вход передаются параметры USERNAME и PASSWORD.
Никаких запросов ввести пароль, повторить его (как в passwd) быть не должно.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-13 10:44:42

дак это можно и через шелл

Код: Выделить всё

zg# chpass -p '$1$T4fjxxY2$CxxxxxxxxwsUIBh.' ti
chpass: user information updated
zg# 
man chpass

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: execl и cmd1 | cmd2

Непрочитанное сообщение hizel » 2008-08-13 11:01:32

кстати да открытый пароль в командной строке совершенно невообразимо не секурно :)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-13 11:15:36

да нормально, я всегда из скриптов юзаю

Код: Выделить всё

echo xx:xx::xx:.. | adduser -f
:smile: если есть, то почему бы не воспользоваться :roll:

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-13 14:46:13

zg писал(а):дак это можно и через шелл

Код: Выделить всё

zg# chpass -p '$1$T4fjxxY2$CxxxxxxxxwsUIBh.' ti
chpass: user information updated
zg# 
man chpass
Этот способ знаю.
Его самым первым спрограммировал.

Всем большое спасибо за ответы.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-13 15:51:37

а чем был обусловлен выбор именно C? если не секрет

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-13 16:31:06

zg писал(а):а чем был обусловлен выбор именно C? если не секрет
В оновном потому, что он мне привычнее. Ранее я в основном занимался приложениями под Windows.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-13 16:44:49

SergeyJ2 писал(а):В оновном потому, что он мне привычнее. Ранее я в основном занимался приложениями под Windows.
гм.. странно.. а ты С++ не изучал?

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-13 17:42:20

zg писал(а):
SergeyJ2 писал(а):В оновном потому, что он мне привычнее. Ранее я в основном занимался приложениями под Windows.
гм.. странно.. а ты С++ не изучал?
Да нет, почему же... изучал :)
Только здесь (для реализации этой задачи) он зачем?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: execl и cmd1 | cmd2

Непрочитанное сообщение zg » 2008-08-13 20:09:14

да нет, просто интересно :smile: флужу, по маленьку :roll:

SergeyJ2
рядовой
Сообщения: 28
Зарегистрирован: 2008-08-11 14:21:18

Re: execl и cmd1 | cmd2

Непрочитанное сообщение SergeyJ2 » 2008-08-13 20:48:53

zg писал(а):да нет, просто интересно :smile: флужу, по маленьку :roll:
а, понятно :)