Подключение к удаленному серверу и переключение пользователя с помощью bash / Ожидайте - PullRequest
1 голос
/ 13 января 2012

Первый пост, заранее спасибо за любую помощь.

Я немного новичок в написании сценариев в целом, но мне удалось создать хорошую оболочку в bash, которая предназначена для сбора некоторых переменных, а затем для подключения к паре удаленных блоков и выполнения некоторых действий, связанных с веб-статистикой. система и запустить некоторые процессы hadoop. В основном это серия утомительных задач, которые я пытаюсь автоматизировать. (ненужные детали завершены).

Проблема, с которой я сталкиваюсь, заключается в том, чтобы найти способ эффективно подключаться к удаленным серверам, аутентифицироваться как обычный пользователь, а затем переключать пользователей для выполнения различных задач. Вот соответствующий код:

    #!/bin/sh
    #Script's run as root. this asks for the sudoers pass
    read -p "Enter password for $SUDO_USER: " -s password
    #Defines some testing commands I want to pass to a remote box
    CMD="hostname; id; sudo su -; id; pwd;"
    #launches an expect script with some defined variables as arguments.
    /home/ME/scripts/derp.expect $SUDO_USER $definedremoteserver "$command" "$password"

Теперь ожидаемый сценарий используется:

    #!/usr/bin/expect
    #expect script to help with SSH connections for the urchinizer bash script
    set arg1 [lindex $argv 0]
    set arg2 [lindex $argv 1]
    set arg3 [lindex $argv 2]
    set arg4 [lindex $argv 3]
    spawn ssh -oStrictHostKeyChecking=no $arg1@$arg2 "$arg3"
    expect "password:"
    send "$arg4\r"
    interact
    expect "password"
    send "$arg4\r"
    interact

У меня проблемы с определением, почему это не удается. Я немного исследовал и пробовал многочисленные варианты кода. В основном, когда я запускаю это, мне нужно пройти, и я могу установить первоначальное соединение. Затем скрипт пытается сменить пользователя, и второе ожидание не выполняется. Первые «id» и «hostname» выводятся успешно. Когда происходит переключение пользователя, второе ожидание не работает, и мне остается только запрос пароля. В любом случае я ввожу свой пароль (который по какой-то причине отображается в виде простого текста), и скрипт просто зависает, не выводя вторую команду 'id' и 'pwd', которую я пытаюсь использовать, чтобы убедиться, что это работает.

Если я на самом деле войду в этот ящик и выполню sudo -i или sudo su - вот как выглядит запрос пароля:

    [sudo] password for my.name:

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

Извините за длинный пост. Это сводило с ума. Возможно ли то, что я пытаюсь сделать? Есть ли более разумный способ справиться с этим? Кто-нибудь замечает какие-либо очевидные ошибки? Кроме того, второстепенный вопрос ... как подстановочные знаки работают в этих строках ожидания?

Ответы [ 2 ]

0 голосов
/ 17 марта 2012

Вы должны использовать «Аутентификацию с открытым ключом» вместо «Аутентификация по паролю» в OpenSSH.

1: создайте пару секретный / открытый ключ для пользователя, которому вы хотите войти с помощью этой команды:

ssh-keygen -t rsa

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

2: с каждого клиентского компьютера, с которого вы хотите войти, скопируйте содержимое нового файла открытого ключа в ваш любимый текстовый редактор (блокнот, gvim и т. Д.)

cat ~/.ssh/id_rsa.pub

Теперь вы должны вставить все открытые ключи вашего клиента в ваш редактор, примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAt9sGP1PKR1XzpozHQc9ufyzOnePHCnRzUhdfSvfQTzJO28CgnHwhANdaBeOrLq5b+VOoPJFj5NquYXmJ6YikSJCwHlvfewA/5p0IkucsJLxqYQMDRhyeXb9fCk85MoNRJjAd+Cst+gI9Cwpp1ysLMDY77k/a9eT3ExkgbGd6mdtfjAlP/o/rRMcqNwp9Pdhh6kkxrM0v1ceNSTbTeO7XCLvekqtRiwjWImhQs56JVbB/RLySNKtqjbpr7Zhn1m+p6+vmBmgwF3xBBvzziYfMm/vG1ZvvGIsI3dxRDWuSZ8+o63w7Y20M9NQn4QkqV6NFjX3conBiDGtDBKain2zj6Q== dino@blackbigone
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0JR6d9LWgvPCbvBajrbVly3cxX7ZkbH4+MUBu+ak2G5SGLbGBcwdi3JquBAT1+U/hl+TKKUUw1XjjjazdjgYCHWIguDWzmqoyT4bQN2aymNoqD35T+LWAaqwC36m95fRfJh3HSOtx7KXpsBZjvR40rg901f8ReIjBoL7G620rrsRDqaDS08Mm6TjThBrCeTYX2YzugodpUNP2evwFOBMrYw/TIcX5Lza8xRCctm8MRodsx/yvuYuZJSanVLs3Q6sJ/n9o20L8Jt1Fu1cnyxJTs9THiLOnZyrTBXvbKJymit6p3hfDpDlWtO/crNeyt0H8jJcZfiCnhQwfib2VMMqJw== erica@blackbigone

3: вставьте защищенные открытые ключи ascii, которые есть в вашем текстовом редакторе, в файл ~ / .ssh / authorized_keys на каждом сервере SSH, в который вы хотите войти. Вы должны быть пользователем, которого вы хотите войти. Создайте файл, если он не существует. Таким образом, вы предоставляете разрешение на вход в систему на сервере, где вы создали файл author_keys, всем пользователям, имеющим указанные открытые ключи. Вход в систему успешен, если у пользователя есть правильный соответствующий закрытый ключ.

После входа в систему на удаленном сервере вы можете использовать sudo (сначала необходимо настроить файл / etc / sudoers с помощью команды visudo) для выполнения команд другим пользователем. Чтобы sudo не запрашивал пароль (потому что вы прошли аутентификацию в / etc / sudoers ...), вы должны установить флаг NOPASSWD, как показано ниже:

%admin ALL=(ALL) NOPASSWD: ALL
0 голосов
/ 15 января 2012

Если можете, используйте некоторый язык сценариев, например, Perl, Python или Ruby, с некоторым модулем для SSH.

Например, используя Perl и модуль Net :: OpenSSH :

use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($host, user => $user, password => $password);
my $output = $ssh->capture({stdin_data => "$sudo_password\n"},
                           'sudo', '-Sk', '-p', '', '--',
                           'ls', '/');
...