Страница 1 из 1

execl и cmd1 | cmd2

Добавлено: 2008-08-11 14:25:52
SergeyJ2
Добрый день.
Друзья, можно ли каким-либо способом выполнить конструкцию, например
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);
}

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-11 19:22:35
Alex Keda
э... а программа делает не тоже самое? и не также ли?
=========
Я не программер на сях, поэтому такие вопросы в аську - несколько странно.
это к тому что я не ответил. вопрос видел, но ответить не успел - оторвали =)

Re: execl и cmd1 | cmd2

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-11 21:15:15
hizel
что то мне подсказывает, что писать на Си как на shell несовсем идеологически верно? :)

Re: execl и cmd1 | cmd2

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

Re: execl и cmd1 | cmd2

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-12 7:01:11
SergeyJ2
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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-12 7:04:08
SergeyJ2
hizel писал(а):что то мне подсказывает, что писать на Си как на shell несовсем идеологически верно? :)
Я с вами согласен в этом.

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-12 8:24:19
hizel
складываю 2 и 2 получаю:

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

user@host /usr/src/usr.bin/passwd >vim passwd.c
;)

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-12 11:38:00
SergeyJ2
hizel писал(а):складываю 2 и 2 получаю:

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

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-12 17:49:57
paradox
озвучте полную задачу
а не угадывайте пути ее решения

Re: execl и cmd1 | cmd2

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 10:44:42
zg
дак это можно и через шелл

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 11:01:32
hizel
кстати да открытый пароль в командной строке совершенно невообразимо не секурно :)

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 11:15:36
zg
да нормально, я всегда из скриптов юзаю

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 14:46:13
SergeyJ2
zg писал(а):дак это можно и через шелл

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

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

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 15:51:37
zg
а чем был обусловлен выбор именно C? если не секрет

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 16:31:06
SergeyJ2
zg писал(а):а чем был обусловлен выбор именно C? если не секрет
В оновном потому, что он мне привычнее. Ранее я в основном занимался приложениями под Windows.

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 16:44:49
zg
SergeyJ2 писал(а):В оновном потому, что он мне привычнее. Ранее я в основном занимался приложениями под Windows.
гм.. странно.. а ты С++ не изучал?

Re: execl и cmd1 | cmd2

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

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 20:09:14
zg
да нет, просто интересно :smile: флужу, по маленьку :roll:

Re: execl и cmd1 | cmd2

Добавлено: 2008-08-13 20:48:53
SergeyJ2
zg писал(а):да нет, просто интересно :smile: флужу, по маленьку :roll:
а, понятно :)