Страница 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, потому как она вызывает шелл Судя по ману.

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 несовсем идеологически верно?

да нормально

исходники подправил и вперёд

зато на парсинге будет зверская экономия
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, потому как она вызывает шелл Судя по ману.

немноо переделал:
заменил:
Код: Выделить всё
close(fds[0]);
dup2(fds[1], 1);
execl("/bin/echo", "echo","zxcv", NULL);
perror("failed to run ls");
на:
А вот выполнить все это в одном 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
да нормально, я всегда из скриптов юзаю

если есть, то почему бы не воспользоваться

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
да нет, просто интересно

флужу, по маленьку

Re: execl и cmd1 | cmd2
Добавлено: 2008-08-13 20:48:53
SergeyJ2
zg писал(а):да нет, просто интересно

флужу, по маленьку

а, понятно
