URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9710
[ Назад ]

Исходное сообщение
"Передать в ssh пароль в качестве переменной"

Отправлено Shinma , 26-Июл-13 15:30 
#!/sbin/sh
print "Enter password for root"
read pass
echo $pass
ssh  root@server < $pass

не работает. Подскажите как мне зайти таким способом, чтобы пароль вписывал я, а потом его использовать в скрипте для соединения по ssh. Это надо, чтоб N-ом кол-ве серверов с одинаковыми паролями вводить пароль только один раз. дальше все это будет в цикле итд, но сама процедура коннекта по паролю в переменной у меня не работает. Expect не подойдет.



Содержание

Сообщения в этом обсуждении
"Передать в ssh пароль в качестве переменной"
Отправлено pavel_simple , 26-Июл-13 15:37 
>[оверквотинг удален]
> print "Enter password for root"
> read pass
> echo $pass
> ssh  root@server < $pass
> не работает. Подскажите как мне зайти таким способом, чтобы пароль вписывал я,
> а потом его использовать в скрипте для соединения по ssh. Это
> надо, чтоб N-ом кол-ве серверов с одинаковыми паролями вводить пароль только
> один раз. дальше все это будет в цикле итд, но сама
> процедура коннекта по паролю в переменной у меня не работает. Expect
> не подойдет.

bash

(sleep 5;echo password;sleep 5;id) | ssh user@host


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 26-Июл-13 15:44 
>[оверквотинг удален]
>> echo $pass
>> ssh  root@server < $pass
>> не работает. Подскажите как мне зайти таким способом, чтобы пароль вписывал я,
>> а потом его использовать в скрипте для соединения по ssh. Это
>> надо, чтоб N-ом кол-ве серверов с одинаковыми паролями вводить пароль только
>> один раз. дальше все это будет в цикле итд, но сама
>> процедура коннекта по паролю в переменной у меня не работает. Expect
>> не подойдет.
> bash
> (sleep 5;echo password;sleep 5;id) | ssh user@host

не совсем понял, как это работает, но на выходе всегда одно и то-же
Pseudo-terminal will not be allocated because stdin is not a terminal
Password:

а он не должен был запрашивать пароль


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 26-Июл-13 15:59 
У меня есть только
SHELL=/usr/bin/ksh

И я могу использовать только
#!/sbin/sh

жопа, но вот как то так(


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 26-Июл-13 21:03 
> У меня есть только
> SHELL=/usr/bin/ksh
> И я могу использовать только
> #!/sbin/sh
> жопа, но вот как то так(

Perl не спасёт отца русской демократии?

#!/usr/bin/perl

use warnings;
use strict;
use Net::SSH::Perl;

my $host = 'x.x.x.x';
my $user = 'user';
my $cmd  = 'pwd';

my $ssh = Net::SSH::Perl->new($host);
print "Enter pass: ";
my $pass = <STDIN>;
chomp $pass;
$ssh->login($user, $pass) or die "Kiss my ass! $!";
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
print "\n" . $exit . "\n";
print "\n" . $stderr . "\n";
print "\n" . $stdout . "\n";

P.S. Не забыть выставить в sshd_config
PasswordAuthentication yes


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 27-Июл-13 12:32 
Не забыть выставить в sshd_config
PasswordAuthentication yes

#!/usr/bin/perl

use warnings;
use strict;
use Net::SSH::Perl;

my $host = 'x.x.x.x';
my $user = 'user';
my $cmd  = 'pwd';

my $ssh = Net::SSH::Perl->new($host);
print "Enter pass: ";
my $pass = <STDIN>;
chomp $pass;
$ssh->login($user, $pass) or die "Kiss my ass! $!";
my($stdout, $stderr, $exit) = $ssh->cmd($cmd);
print $stdout."\n";
print $stderr."\n" if defined $stderr;
print $exit."\n";

Так правильней, иначе плюётся на undef $stderr

Самому стало интересно, поискал, нашёл. ))
Вот выжимка.

#!/bin/sh

# remote host
HOST="x.x.x.x"

# user on remote host
USER="user"

TMP="/tmp"


out() {
    echo -e "$@"
}

read_pass() {
    out "Enter password for $USER on $HOST (will not echo): "
    stty -echo
    read PASS
    stty echo
    if [ -z "$PASS" ]; then
        error "\n No password entered!"
    fi
}

create_askpass() {
    TMP=$(mktemp /tmp/$USER$HOST.XXXXXXXXXX) || $TMP="/tmp/$USER$HOST.$$"
    if [ -z "$DISPLAY" ]; then
        export DISPLAY=":0.0"
    fi
    out "#!/bin/sh\necho '$PASS'" > $TMP
    chmod 500 $TMP
    export SSH_ASKPASS=$TMP
}

cleanup() {
    $(which rm) -f $TMP
}

main() {
    read_pass
    create_askpass
    setsid ssh $USER@$HOST "ls -1"
    cleanup
}

main "$@"


Источники:
http://www.linuxforums.org/forum/programming-scripting/10780...
http://andre.frimberger.de/index.php/linux/reading-ssh-passw.../
http://alexandr.sysoev.ru/node/136
http://pentestmonkey.net/blog/ssh-with-no-tty
http://www.nuclearcat.com/mediawiki/index.php/Ssh_askpass
http://superuser.com/questions/393506/can-i-automatically-lo...

Ложка дёгтя.
Во FreeBSD нет штатного setsid - для создания нового сеанса.
Но мир не без добрых людей.
http://freebsd.1045724.n5.nabble.com/setsid-not-found-on-fre...
http://lists.freebsd.org/pipermail/freebsd-hackers/2011-Febr...
Сцылки бывают дохнут, поэтому сюда скопипастю, на всякий случай.))

cat setsid.c

/*
* setsid.c -- execute a command in a new session
* Rick Sladkey <jrs@world.std.com>
* In the public domain.
*
* 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
* - added Native Language Support
*
* 2001-01-18 John Fremlin <vii@penguinpowered.com>
* - fork in case we are process group leader
*
* 2011-02-14 Jason J. Hellenthal <jhell@DataIX.net>
* - removed nls support for this simple command.
*
*/

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

#define _(Text) (Text)

int
main(int argc, char *argv[]) {
    
    if (argc < 2) {
        fprintf(stderr, _("usage: %s program [arg ...]\n"),
            argv[0]);
        exit(1);
    }
    if (getpgrp() == getpid()) {
        switch(fork()){
        case -1:
            perror("fork");
            exit(1);
        case 0:        /* child */
            break;
        default:    /* parent */
            exit(0);
        }
    }
    if (setsid() < 0) {
        perror("setsid"); /* cannot happen */
        exit(1);
    }
    execvp(argv[1], argv + 1);
    perror("execvp");
    exit(1);
}

gcc -O2 -o setsid setsid.c

Работает.
P.S.
или port
/usr/ports/net/nxproxy/files/setsid.c


"Передать в ssh пароль в качестве переменной"
Отправлено Andrey Mitrofanov , 26-Июл-13 23:58 
>> не подойдет.

Вот ещё так (примерно - если правильно вспомнил) попробуй:

$ cat <<EEE >~/secret_pass
#!/bin/sh

echo "ZupperPassWorrd"
EEE
$ chmod +x ~/secret_pass
$ SSH_ASKPASS=~/secret_pass ssh remote.host $THE_COMMAND _

google://SSH_ASKPASS


> bash
> (sleep 5;echo password;sleep 5;id) | ssh user@host

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


"Передать в ssh пароль в качестве переменной"
Отправлено oraerkx , 26-Июл-13 16:36 
>[оверквотинг удален]
> print "Enter password for root"
> read pass
> echo $pass
> ssh  root@server < $pass
> не работает. Подскажите как мне зайти таким способом, чтобы пароль вписывал я,
> а потом его использовать в скрипте для соединения по ssh. Это
> надо, чтоб N-ом кол-ве серверов с одинаковыми паролями вводить пароль только
> один раз. дальше все это будет в цикле итд, но сама
> процедура коннекта по паролю в переменной у меня не работает. Expect
> не подойдет.

чем не подходит схема авторизации по ключам?
примеры: http://habrahabr.ru/post/122445/


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 27-Июл-13 16:31 
условия такие
есть только:
SHELL=/usr/bin/ksh
И я могу использовать только
#!/sbin/sh
менять в ос ничего нельзя. устанавливать что-то тоже нельзя. только этим штатными средствами.
схема по ключам мне не устраивает тем, что для этого надо с начало создать эти самые ключи на всех серверах. мне надо чтобы я сам ключ вводил, но походу придется все таки руками вводить(

"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 27-Июл-13 16:47 
> условия такие
> есть только:
> SHELL=/usr/bin/ksh
> И я могу использовать только
> #!/sbin/sh
> менять в ос ничего нельзя. устанавливать что-то тоже нельзя. только этим штатными
> средствами.
> схема по ключам мне не устраивает тем, что для этого надо с
> начало создать эти самые ключи на всех серверах. мне надо чтобы
> я сам ключ вводил, но походу придется все таки руками вводить(

Ну если уж минималистический Bourne shell (bin/sh) не подходит, значит не судьба. ))


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 27-Июл-13 16:53 
> Ну если уж минималистический Bourne shell (bin/sh) не подходит, значит не судьба.
> ))

ну я просто не вижу тут ни одного совета который бы не использовал другой софт.
у тебя есть пример на bin/sh для первого поста???


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 27-Июл-13 17:06 
>> Ну если уж минималистический Bourne shell (bin/sh) не подходит, значит не судьба.
>> ))
> ну я просто не вижу тут ни одного совета который бы не
> использовал другой софт.
> у тебя есть пример на bin/sh для первого поста???

Это был сарказм.
Пост 7 пробовали?
С другой стороны, интерпретатор ksh Korn совместим с Bourne снизу вверх.


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 27-Июл-13 17:42 
извините недопонимание.
от 7 поста мне выдает ошибку
setsid:  not found.
тот пункт тоже включает доп софт, а именно gcc компиляцию или готовый setsid у меня нету такой роскоши. Поэтому вопрос таким способом решить не удалось.

"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 27-Июл-13 18:06 
> извините недопонимание.
> от 7 поста мне выдает ошибку
> setsid:  not found.
> тот пункт тоже включает доп софт, а именно gcc компиляцию или готовый
> setsid у меня нету такой роскоши. Поэтому вопрос таким способом решить
> не удалось.

Скомпилить на стороне и скопировать на рабочую систему?
Тоже нет? Ну, так я же говорю, не судьба.


"Передать в ssh пароль в качестве переменной"
Отправлено shinma , 27-Июл-13 18:15 

> Скомпилить на стороне и скопировать на рабочую систему?
> Тоже нет? Ну, так я же говорю, не судьба.

вопрос не тему:если я скомпилю у себя дома на пеньке эту штуку заработает ли она на  hp-ux  на      ia64 pa-risc вые процы


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 27-Июл-13 18:20 
>> Скомпилить на стороне и скопировать на рабочую систему?
>> Тоже нет? Ну, так я же говорю, не судьба.
>  вопрос не тему:если я скомпилю у себя дома на пеньке эту
> штуку заработает ли она на  hp-ux  на  
>    ia64 pa-risc вые процы

Я тут некопенгаген. Спецы и кто в теме если захотят подскажут как.
Там свои тонкости и нюансы есть. Теоретически должно запуститься. Или одно из двух.


"Передать в ssh пароль в качестве переменной"
Отправлено Аноним , 27-Июл-13 23:50 
>> штуку заработает ли она на  hp-ux  на ia64 pa-risc вые процы

Так PA-RISC или IA64? Это если что - разные вещи :)

> Теоретически должно запуститься.

Охни*%$себе! А можно услышать эту теорию? Ну чиста поржать?


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 28-Июл-13 04:51 
>>> штуку заработает ли она на  hp-ux  на ia64 pa-risc вые процы
> Так PA-RISC или IA64? Это если что - разные вещи :)

Замечательно, что вы знаете отличительные особенности этих "разных вещей".
>> Теоретически должно запуститься.

Но в данном контексте для ТС гораздо важней знать, то, что поскольку скомпилированный исполняемый setsid является не более чем небольшой оберткой вокруг системного вызова setsid, доступен ли это системный вызов на его "hp-ux  на ia64 pa-risc вых процах"
Если да, то скомпилировать аскетичный (всего с одним инклюдом) setsid.c
#include <unistd.h>
int main(int argc,char** argv)
{
    setsid();
    execvp(argv[1], argv+1);
    return 0;
}
перекинуть blob и проверить теорию на практике.
Вопрос ему надо решить ГДЕ скомпилировать.

> Охни*%$себе! А можно услышать эту теорию? Ну чиста поржать?

На аналогичное глумление здесь уже отправляли ... в стойло, ржать там.


"Передать в ssh пароль в качестве переменной"
Отправлено Andrey Mitrofanov , 27-Июл-13 21:18 
> #!/sbin/sh
> print "Enter password for root"
> read pass
> echo $pass
> ssh  root@server < $pass
> не работает. Подскажите как мне зайти таким способом, чтобы пароль вписывал я,
> а потом его использовать в скрипте для соединения по ssh. Это
> надо, чтоб N-ом кол-ве серверов с одинаковыми паролями вводить пароль только
> один раз

Вообще, дурацкая идея ходить root-ом по ssh. Ну, может и не такая дурацкая. Но вот ходить root-ом на по ssh много серверов c _одним паролем -- точно от несообразительности. Но даже если и этому можно представить применение, то ещё и раскладывать _этот _пароль в скриптах открытым текстом - точно безобразие.

Я на серверы вхожу _своим логином и по ключу (агент на лок.машине, ввести пароль 1 раз) по ssh, дальше [gnu screen, дальше] по sudo (группа wheel и т.п.) с вводом _моего пароля - шел root-а. Потом-потом детач screen-а, отключение от ssh. В след.раз - вход по ssh (по ключу), приатачивание к "уже готовому" screen (с root шелом в т.ч.). И это тоже, наверное, безобразие -- для кого-то...

Если нужно исполнять _одинаковые команды многократно под root-ом, то, наверное, нужно их выписывать по одной (и с полной ком.строкой, по возможности, и, по возможности же, без изменений вообще - только чтение) в sudo. Исполнение на ку-у-уче серверов - это вообще спорт такой = кто во что горазд. Посмотри в гуглях какой-нибудь gnu parallel или всяческие наколеночные параллельные ssh, вагон их. [Заметить по пути, что исполнялки эти ещё и срабатывать будут на разных серверах через раз.] Дальше - всяческие кластерные [доменые?] прибамбасы, удалённые управлялки, запускалки задач и проч.менеджмент, наверное...

То есть исходная задача решаема, конечно, но постановка, скорее всего, неверна.


"Передать в ssh пароль в качестве переменной"
Отправлено михалыч , 28-Июл-13 06:34 
> раскладывать _этот _пароль в скриптах
> открытым текстом - точно безобразие.

Можно и без безобразия.))

#!/bin/sh

if [ -n "$SSH_ASKPASS_" ]; then
     echo "$SSH_ASKPASS_"
else
    stty -echo
    read SSH_ASKPASS_
    stty echo
    export SSH_ASKPASS=$0
    export SSH_ASKPASS_
    export DISPLAY=:0
    setsid $@
fi

Запускать так: ssh user@x.x.x.x ls -1
Но это уже офтопик.


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 28-Июл-13 17:11 
я не смог найти HP-UX да еще с gcc в комплекте. если попробовать на BSD скачать и скомпилировать hp-ux скушает бинарник? нет возможности бесплатно скачать ОС , трафик платный, поэтому с начало спрашиваю.

"Передать в ssh пароль в качестве переменной"
Отправлено Andrey Mitrofanov , 28-Июл-13 17:24 
> я не смог найти HP-UX да еще с gcc в комплекте. если
> попробовать на BSD скачать и скомпилировать hp-ux скушает бинарник? нет возможности
> бесплатно скачать ОС , трафик платный, поэтому с начало спрашиваю.

google://hpux cross-compile gcc

и гугле-транслаите для прискорбных языком позикс-профессионалов.


"Передать в ssh пароль в качестве переменной"
Отправлено Shinma , 29-Июл-13 08:06 
Скомпилил это дело на freebsd x64. HP-UX ругается. в обещм никак а до кросплатформенного решения я пока не дочитал маны. жаль. но все равно всем спасибо.