LINUX.ORG.RU

программный ввод пароля в ssh


0

3

Привет. Хочу сделать програмулинку, чтобы отключать все компы в сети. Сделал


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

int main(void) 
{
	char *cmd[] = { "/usr/bin/ssh administrator@192.168.1.1",  0 };

	FILE *pipe_writer=NULL;

	if (fork())
	{
		pipe_writer=popen(cmd[0] ,"w");
	}else
	{
		sleep(5);
		fputs("password", pipe_writer);
	}
	pclose(pipe_writer);
	return 0;
}

не работает (пароль не передаётся в ssh). подскажите, куда копать?


может лучше по ключу авторизацию делать - пароль вводить не надобудет

а так попробуйте добавить \n в конце пароля

guilder ()
Ответ на: комментарий от anon_666

вот вывод

strace ./test
execve("./test", ["./test"], [/* 46 vars */]) = 0
brk(0)                                  = 0x843d000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78a6000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=102026, ...}) = 0
mmap2(NULL, 102026, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb788d000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000m\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1405508, ...}) = 0
mmap2(NULL, 1415592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xc13000
mprotect(0xd66000, 4096, PROT_NONE)     = 0
mmap2(0xd67000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x153) = 0xd67000
mmap2(0xd6a000, 10664, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xd6a000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb788c000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb788c6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xd67000, 8192, PROT_READ)     = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0x71e000, 4096, PROT_READ)     = 0
munmap(0xb788d000, 102026)              = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb788c728) = 3881
brk(0)                                  = 0x843d000
brk(0x845e000)                          = 0x845e000
pipe2([3, 4], O_CLOEXEC)                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb788c728) = 3882
close(3)                                = 0
fcntl64(4, F_SETFD, 0)                  = 0
close(4)                                = 0
waitpid(3882, [sudo] password for administrator: 0xbfb8ff30, 0)            = ? ERESTARTSYS (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
waitpid(3882, 0xbfb8ff30, 0)            = ? ERESTARTSYS (To be restarted)
--- SIGWINCH (Window changed) @ 0 (0) ---
waitpid(3882, 

W03L ()

ЕМНИП, пароль считывается напрямую с tty

Kosyak ★★★★ ()
Ответ на: комментарий от TERRANZ

не работает, даже из командной строки. [code=bash] administrator:password@192.168.1.1's password: [/code]

W03L ()
Ответ на: комментарий от anonymous

ключ будет установлен=>любой с тачки А пишет ssh b@B и всё, доступ есть. а мне надо программку сделать, чтобы отдать её в комп. класс и преподаватели могли исполнить её для отключения компов.

W03L ()

Когда-то я для массового выключения делал два разных скрипта. Сначала это был «демон», который каждые 3-5с проверял наличие определенного файла в примонтированной по nfs директории. Как только файл появлялся, компьютер выключался. Затем я просто настроил везде авторизацию ssh по ключу и в цикле запускал ssh root@komputer poweroff.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от W03L

любой с тачки А пишет ssh b@B и всё, доступ есть

Не любой, а только тот, у кого есть ключ.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от W03L

Не любой, а тот пользователь машины A, который обладает ключом. Если беспокоит безопасность, на машине B надо создать специального пользователя, которому через sudo разрешить выключение компьютера, и остальным пользователям дать доступ именно к нему.

В любом случае ваш подход с захардкоденным паролем ничем не лучше. Дизассемблировать исполняемый файл и найти там пароль сложности не представляет. Не говоря уже про strace.

Legioner ★★★★★ ()
Ответ на: комментарий от W03L

> и всё, доступ есть

Доступ есть только с тачка А и от пользователя a.

отдать её в комп. класс и преподаватели могли исполнить её для отключения компов.

А в чем проблема-то?

И пиши на баше, а не си.

anonymous ()

В пакете putty (putty-tools) есть программка plink, она делает то что тебе нужно и умеет принимать пароль как параметр -pw

sdio ★★★★★ ()

administrator@192.168.1.1

Офигеть, «все компы в сети».

Вообще, ЛОР торт - чувак просит прострелить ему ногу, а все радостно помогают.

thesis ★★★★★ ()
Ответ на: комментарий от thesis

а все потому что учатся только на своих ошибках.

mono ★★★★★ ()
Ответ на: комментарий от thesis

Офигеть, «все компы в сети».
Вообще, ЛОР торт - чувак просит прострелить ему ногу, а все радостно помогают.

это я к примеру, главное механизм, а остальное дело техники ;)

W03L ()
Ответ на: комментарий от sdio

>В пакете putty (putty-tools) есть программка plink, она делает то что тебе нужно и умеет принимать пароль как параметр -pw

sdio, спасибо, на эту утилитку склепаю оболочку ))))

W03L ()

В inetd повесить: 1666 stream tcp nowait poweroffd /bin/sh sh /usr/local/sbin/poweroff.sh

poweroff.sh:

#!/bin/sh
read cmd
echo "$cmd"

if [ "x$cmd" = "xpoweroff" ]; then
    poweroff
fi

exit 0

Для выключения:

#!/bin/sh

die()
{
    echo "$*" 1>&2
    exit 1
}

if [ "x$1" = "x" ]; then
    die "Usage: $0 ip"
fi

echo poweroff | nc "$1" 1666

Так безопаснее. Еще лучше в скрипте проверять что никто не залогинен.

rymis ★★ ()
Ответ на: комментарий от rymis

А ваша «защита» ломается стандартной командой strings:

strings myverysecureprog
...
password
...

rymis ★★ ()
Ответ на: комментарий от Eddy_Em

Более того, даже в основных репозитариях прописался.

Грустнее всего, что ТС сказочный велосипедист и костылеклепатель и никак этого не осознал.

baverman ★★★ ()

OMG! а нафига это писать на Си?

обычный шелл + авторизация по ключу.

Deleted ()
Ответ на: комментарий от Eddy_Em

> Так и ученики смогут любой компьютер выключить. Где авторизация?

авторизация лишняя. использовать xinetd и прописать only_from

ananas ★★★★★ ()
Ответ на: комментарий от eval-apply

Про putty я уже давно и забыл, что за настройки там были. И не помню, зачем они были нужны. Если их нет в линуксовых терминалах, значит, они просто не нужны.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от name_no

>> чувак просит прострелить ему ногу, а все радостно помогают.

На других форумах вообще в поиск посылают.


И правильно делают. По мне так лучше вообще не отвечать, чем давать дурные советы.

P.S. Какие, к дьяволу, пароли? Надо авторизацию по ключу делать.

shylent ()
Ответ на: комментарий от ananas

Тогда монтировать nfs и запускать демона, как я выше говорил. В этом случае отключение будет еще и параллельным.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

> Затем я просто настроил везде авторизацию ssh по ключу и в цикле запускал ssh root@komputer[i] poweroff

более забавный вариант - добавить беспарольного пользователя с шелом /sbin/poweroff и логиниться под ним

ananas ★★★★★ ()
Ответ на: комментарий от ananas

ananas> более забавный вариант - добавить беспарольного пользователя с шелом /sbin/poweroff и логиниться под ним

Рутовые права надо будет дать

sdio ★★★★★ ()
Ответ на: комментарий от sdio

никто не мешает этому пользователю дать uid 0

ananas ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.