Подтвердить что ты не робот

Putty не будет кэшировать ключи для доступа к серверу при запуске script в hudson

У меня был простой процесс автоматизации для записи, который должен был скопировать несколько файлов с Linux-сервера в Windows через SSH. Это можно выполнить с помощью шпатлевки.

SSH, как часть протокола, проверяет идентификатор хоста и, если он не известен, подскажет вам принять идентификатор хостов. Когда я вручную подключаю сервер linux со шпателем, он не будет запрашивать какую-либо информацию, чтобы принять идентификатор хостов. Но как только я включил этот процесс автоматизации в Хадсон в качестве задания расписания. Точное сообщение было:

Ключ хоста сервера не кэшируется в реестре. У вас нет гарантируйте, что сервер - это компьютер, который вы так считаете. Ключевой отпечаток сервера rsa2: ssh-rsa 1024 cc: 78: 13: a3: 68: a6: 59: 7e: b8: 23: 2d: 13: 3e: 66: 9b: b9 Если вы доверяете этому host, введите "y", чтобы добавить ключ в кеш PuTTY и продолжить подключения. Если вы хотите продолжать соединение только один раз, без добавив ключ в кэш, введите "n". Если вы не доверяете этому хосту, нажмите Return, чтобы отказаться от соединения. Сохранить ключ в кеше? (Г/л) Соединение заброшено.

Обычно вы нажимаете "Y" здесь, считая ключ хоста правильным, чтобы сохранить его в будущем соединении. Хранение этого происходит в реестре под HKEY_CURRENT_USER\Software\SimonTatham\Putty\SshHostKeys

Но, к сожалению, процесс автоматизации, запущенный в Хадсоне, не может взаимодействовать, нажав "Y", чтобы сохранить ключ хоста в кеште. А также я не могу воспроизвести проблему, просто запустив процесс автоматизации под командой dos.

Кто-нибудь знает, как решить проблему?

4b9b3361

Ответ 1

echo y | pscp -i /path/to/key/file [email protected]:/tmp/file  .
echo y | plink -i /path/to/key/file scripts.sh

он сохранит ключевое пальцевое имя узла до следующего местоположения в первый раз и в следующий раз будет игнорировать "y"

HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys

Ответ 2

Для внутренних серверов трюк echo y | ..., вероятно, является адекватным (и супер простым).

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


Создайте REG файл, который можно запустить на клиентских компьютерах.

  • Взаимодействовать в интерактивном режиме с любой машины plink ...
  • Проверить и принять ключ хоста
  • Открыть regedit
  • Перейдите к HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
  • Щелкните правой кнопкой мыши запись (будет иметь имя типа [email protected]<port>:<address>)
  • Экспорт в .reg файл

Кэш ключа хоста на клиентских компьютерах

  • Запустите файл .reg на любом клиентском компьютере, который будет подключаться к этому серверу.
  • Обязательно войдите в систему, используя учетную запись пользователя, которая будет запускать plink (т.е. в случае, если это учетная запись службы).

Ответ 3

У меня также была эта проблема при использовании планировщика партий, который использует учетную запись Local System. С этой учетной записью вы не можете войти в систему, чтобы принять ключ хоста или вручную установить значение HKEY_CURRENT_USER. Я обнаружил, что создаю следующий ключ:

HKEY_USERS\.DEFAULT\Software\SimonTatham\PuTTY\SshHostkeys

и добавление значения строки хоста, работающего для учетной записи Local System.

Ответ 4

У меня возникла эта проблема при использовании Bazaar и вручную, чтобы мой клиент ssh был замазкой, а не встроенным paramiko, и Я получал ту же самую проблему, когда пытался сказать, что ключ не был в "известных хостах" и спрашивает, следует ли мне его проверять, но из-за того, что он управляется другой программой, а не в обычном терминале, это просто немедленно вышли.

Если вы можете, просто запустите putty и подключитесь к серверу вручную, чтобы заставить его сохранить открытый ключ ssh в реестре, поэтому, когда автоматическая программа пытается подключиться к нему, не будет представлена ​​опция y/n.

Или вы можете использовать небольшой python3 script, который я написал для преобразования между двумя форматами "известного хоста", которые используют putty и openssh: https://github.com/mgrandi/openssh-putty-knownhost-converter

`

Ответ 5

Начиная с 9 сентября 2014 года с соответствующей версией plink (проверенной с помощью plink 0.66), вы можете использовать опцию -hostkey, как описано здесь:

http://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/accept-host-keys.html

Используя ключ в исходном вопросе:

plink -hostkey cc:78:13:a3:68:a6:59:7e:b8:23:2d:13:3e:66:9b:b9 [email protected] 

Я успешно использовал "-hostkey" в своих сценариях, чтобы обойти проблему с начальным вызовом основного ключа.

"- hostkey" также документируется для работы с pscp (версия 0.66).

Обратите внимание, что вы должны изменить ключ хоста, если вы меняете хосты или сервер sshd пересчитывает ключ.

Ответ 6

echo y | plink -ssh <[email protected]> -pw <password> exit
plink -ssh <[email protected]> -pw <password> [yourcommand]

Объяснение: Используя echo to pipe, пользователь вводит 'y' в выбранную команду, а затем выходит. Следующий оператор затем вызовет исполняемый файл plink второй раз для запуска вашей команды.

Ответ 7

Решение по коду: скомпилируйте шпатлевку /plink для автоматического приема и сохранения ключей ssh ​​

Вам будет предложено сохранить ключи хоста SSH в кеше. Поскольку учетная запись пользователя выполняет plink, не имеет хоста в реестре, он зависает, потому что он ждет ответа (да/нет..).
Если вы хотите решить это с помощью кода, получите исходный код putty, внесите некоторые изменения, скомпилируйте и используйте новый двоичный файл plink - тот, который хранит ключ ssh host без подсказки.
Как это сделать? Для окон я делаю следующее:

  • Загрузите последний исходный код штыря: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
    (Найдите раздел "Исходный код" и загрузите "Архив исходного кода Windows" )
    Внимание. Чтобы открыть исходный код шпатлевки с помощью Visual Studio, вы должны загрузить версию выпуска. Если вы выберете конкретную команду фиксации (или главы), файлы решений Visual Studio будут не существует, поскольку они созданы во время сборки.
    Взято из: Невозможно скомпилировать PuTTY, Plink или Pscp в Windows из-за отсутствия подкаталога Windows/MSVC

  • Исходный код должен быть обновлен. Что мы хотим изменить, находится в функции verify_ssh_host_key (..) в "wincons.c". Мы хотим прокомментировать часть кода, в которой запрашивается yes/no и просто сохраните ключ, Начните с комментария кода:

    /*hin = GetStdHandle(STD_INPUT_HANDLE);
    GetConsoleMode(hin, &savemode);
    SetConsoleMode(hin, (savemode | ENABLE_ECHO_INPUT |
             ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT));
    ReadFile(hin, line, sizeof(line) - 1, &i, NULL);
    SetConsoleMode(hin, savemode);
    
    if (line[0] != '\0' && line[0] != '\r' && line[0] != '\n') {
    if (line[0] == 'y' || line[0] == 'Y')
    store_host_key(host, port, keytype, keystr);
    return 1;
    } else {
      fprintf(stderr, abandoned);
      return 0;
    }*/  
    

Продолжайте добавлять вместо этого следующие строки (код, ответственный за сохранение ключа хоста):

store_host_key(host, port, keytype, keystr);
return 1;

Скомпилируйте решение и возьмите plink/pscp.. вам хорошо идти без подсказки, он принимает ключ хоста ssh и сохраняет его в реестре.