Хобрук: Ваш путь к мастерству в программировании

Псевдо-терминал не будет выделен, потому что stdin не является терминалом при запуске ssh через python без paramiko

Я запускаю ssh из Python без использования внешней библиотеки, такой как Paramiko. У меня есть причины делать это таким образом, а не через внешнюю библиотеку.

В основном я делаю subprocess.Popen("ssh -t bla -- command")

При этом я получаю следующее сообщение:

Pseudo-terminal will not be allocated because stdin is not a terminal.

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

Когда я пытаюсь с -t -t (чтобы заставить его), я получаю следующее сообщение:

tcgetattr: Inappropriate ioctl for device

Есть ли способ запустить команду ssh с помощью -t через Python?

11.01.2011

  • Если вы можете повозиться с настройками удаленного sshd, это должно помочь: superuser.com/questions/396994/ 22.05.2012

Ответы:


1

Могу ли я с уважением предположить, что вы задаете неправильный вопрос, и что правильный вопрос может быть чем-то вроде «как мне убедиться, что подпроцесс завершается, когда моя программа на Python завершается»

Вы можете сделать некоторые умные вещи unix, например выделить pty и убедиться, что ваш подпроцесс использует это как std in out и т. д., чтобы команда ssh думала, что она разговаривает с терминалом, а не с каналом, но это, вероятно, не то, что вы очень хочется сделать.

12.01.2011
  • Подпроцесс ssh завершается, когда я убиваю свой скрипт Python. Однако команда, которую он инициировал на удаленном хосте, не завершается, пока я не передам флаг -t команде ssh. Но когда я передаю флаг -t в ssh, он не учитывает этот флаг и выдает мне сообщение об ошибке, которое я вставил в тело вопроса. 12.01.2011
  • Тогда это другой процесс, на который, я думаю, вам следует обратить внимание. Почему он не завершается должным образом, когда удаленный ssh ​​сбрасывается. Похоже, он игнорирует сигнал, которого не должен. 12.01.2011

  • 2

    Чтобы завершить удаленную команду, когда скрипт python будет уничтожен, вы можете (в качестве альтернативы опции -t для ssh) реализовать обходной путь, который использует именованный канал для преобразования «EOF в SIGHUP», когда стандартный ввод sshd закрывается (см. Ошибка 396 — процессы sshd теряются, если pty не выделен).

    # sample code in Bash
    
    # press ctrl-d for EOF
    ssh localhost '
    TUBE=/tmp/myfifo.fifo
    rm -f "$TUBE"
    mkfifo "$TUBE"
    #exec 3<>"$TUBE"
    
    <"$TUBE" sleep 100 &  appPID=$!
    
    # cf. "OpenSSH and non-blocking mode", 
    # http://lists.mindrot.org/pipermail/openssh-unix-dev/2005-July/023090.html
    #cat >"$TUBE"
    #socat -u STDIN "PIPE:$TUBE"
    dd of="$TUBE" bs=1 2>/dev/null
    #while IFS="" read -r -n 1 char; do printf '%s' "$char"; done > "$TUBE"
    
    #kill -HUP -$appPID 
    kill $appPID
    
    rm -f "$TUBE"
    '
    
    06.05.2013

    3

    Похоже, на самом деле вы запрашиваете инверсию старой команды nohup; то есть какой-то способ гарантировать, что удаленная команда отвечает на сигнал HUP (отбой), который генерируется драйвером TTY (PTY или псевдо-tty), когда базовое соединение с ним закрыто.

    Лично я подозреваю, что Paramiko будет намного лучше, чем пытаться управлять этим с помощью подпроцесса модуль. Вы можете заставить Paramiko открывать соединение, выделять pty и выполнять ваши команды без каких-либо проблем; и код для использования ваших существующих known_hosts и файлов идентификации (закрытых ключей) относительно прост.

    В этом рецепте Копировать файлы по SSH с помощью paramiko в ActiveState показаны основы загрузки известных_хостов по ssh с использованием идентификационные файлы и взаимодействие с любым агентом ssh, который вы можете запустить. Оттуда то, о чем вы просите, должно быть просто вопросом:

    Вы также можете использовать TwistedConch реализацию протоколов SSH. Однако разобраться в среде программирования Twisted может быть гораздо сложнее.

    Вот пример простого ssh-сервера в Twisted с поддержкой pty: Twisted Conch за 60 секунд: запросы PTY Вот ветка SO всего за неделю до публикации вашей Лучший способ запускать удаленные команды через ssh в Twisted? но это вообще не касалось проблем, связанных с pty. Глядя на документы для twisted.conch.ssh .session предполагает наличие поддержки pty; но перечисляет его как «Недокументированный».

    Конечно, вы даже можете использовать Pexpect, создав оболочку на локальном ssh< /em> client и отправьте через него удаленную команду. Это будет наиболее точно эмулировать способ запуска команды из вашей собственной оболочки.

    12.04.2011
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...


    © 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании