Приложение Python Flask для отправки запросов на удаленный сервер для запуска скриптов python [duplicate]

+ для следующего брата. Есть ли эквивалент для предыдущего брата?

Вы можете использовать два селектора ax : ! и ?

Там 2 следующие селекторные функции для сиблинга в обычном CSS:

  • + является непосредственным последующим селектором сиблинга
  • ~ является любым последующим селектором сиблинга

. В обычном CSS нет предыдущего селектора sibling.

Однако в ax CSS послепроцессорной библиотеки есть 2 предыдущие селекторные функции:

  • ? - это предыдущий селектор немедленного (напротив +)
  • ! является любым предыдущим селектором (см. ~)

Рабочий пример:

В следующем примере:

  • .any-subsequent:hover ~ div выбирает любой последующий div
  • .immediate-subsequent:hover + div выбирает немедленный последующий div
  • .any-previous:hover ! div выбирает любой предыдущий div
  • .immediate-previous:hover ? div выбирает непосредственный предыдущий div

div {
  display: inline-block;
  width: 60px;
  height: 100px;
  color: rgb(255, 255, 255);
  background-color: rgb(255, 0, 0);
  text-align: center;
  vertical-align: top;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.6s ease-out;
}

code {
  display: block;
  margin: 4px;
  font-size: 24px;
  line-height: 24px;
  background-color: rgba(0, 0, 0, 0.5);
}

div:nth-of-type(-n+4) {
  background-color: rgb(0, 0, 255);
}

div:nth-of-type(n+3):nth-of-type(-n+6) {
  opacity: 1;
}

.any-subsequent:hover ~ div,
.immediate-subsequent:hover + div,
.any-previous:hover ! div,
.immediate-previous:hover ? div {
  opacity: 1;
}
<h2>Hover over any of the blocks below</h2>

<div></div>
<div></div>

<div class="immediate-previous">Hover for <code>?</code> selector</div>
<div class="any-previous">Hover for <code>!</code> selector</div>
<div class="any-subsequent">Hover for <code>~</code> selector</div>
<div class="immediate-subsequent">Hover for <code>+</code> selector</div>

<div></div>
<div></div>

<script src="https://rouninmedia.github.io/axe/axe.js"></script>

87
задан fredley 27 August 2010 в 17:09
поделиться

7 ответов

Я передам вам paramiko

см. этот вопрос

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd_to_execute)
129
ответ дан Community 17 August 2018 в 21:47
поделиться
  • 1
    Предположение здесь состоит в том, что paramiko столь же безопасен, как (открытый) ssh. Это? – user239558 24 February 2015 в 10:09
  • 2
    Что делать, если ssh-ключи обмениваются? – Ardit 9 May 2016 в 10:24
  • 3
    @ R-Dit, для ключей ssh, попробуйте избавиться от параметра пароля и выполнить следующую команду перед подключением: ssh.load_system_host_keys(). – alfonso 14 September 2016 в 19:23
  • 4
    Если вы используете SSH-ключи, сначала подготовьте ключевой файл, используя EITHER: k = paramiko.RSAKey.from_private_key_file(keyfilename) ИЛИ k = paramiko.DSSKey.from_private_key_file(keyfilename) THEN ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) и, наконец, ssh..connect(hostname=host, username=user, pkey=k). – Crossfit_and_Beer 20 April 2017 в 14:21
  • 5
    Будучи долговременным пользователем Paramiko (но не экспертом), я могу предложить использовать Paramiko, но вы должны рассмотреть свои варианты использования и то, насколько вы готовы учиться. Парамико очень низкоуровневый, и вы можете легко попасть в ловушку, где вы создаете «команду, выполняющую вспомогательную функцию» & quot; без полного понимания кода, который вы используете. Это означает, что вы можете спроектировать, скажем, def run_cmd(host, cmd):, который сначала делает то, что вы хотите, но ваши потребности развиваются. Вы в конечном итоге меняете помощника для нового варианта использования, что изменяет поведение старого существующего использования. Планируйте соответственно. – Crossfit_and_Beer 20 April 2017 в 14:27

Или вы можете просто использовать commands.getstatusoutput :

   commands.getstatusoutput("ssh machine 1 'your script'")

Я использовал его широко и отлично работает.

В Python 2.6+, используйте subprocess.check_output .

36
ответ дан Cees Timmerman 17 August 2018 в 21:47
поделиться
  • 1
    +1 для простого простого встроенного метода. В моей текущей настройке я не хочу добавлять библиотеки Python, поэтому ваше предложение ценно, очень просто. – Philip Kearns 26 November 2013 в 11:26
  • 2
    просто убедитесь, что ваш удаленный хост настроен для без пароля ssh, если нет, вам нужно делать другие вещи для управления аутентификацией – powerrox 17 June 2014 в 22:12
  • 3
    subprocess.check_output - отличное решение! – Tim S. 8 September 2015 в 21:52
  • 4
    @powerrox, что это такие "другие вещи? & quot; – ealeon 30 November 2015 в 06:45
  • 5
    @TimS. вам может потребоваться включить обработку для проверки подлинности любыми способами, подходящими для вашей установки. Я использовал для ввода пароля в командной строке. то есть эта нить с другими решениями: unix.stackexchange.com/questions/147329/… – powerrox 1 December 2015 в 17:22

Я использовал paramiko связку (nice) и pxssh (также приятно). Я бы тоже порекомендовал. Они работают несколько иначе, но имеют относительно большое перекрытие в использовании.

3
ответ дан Eric Snow 17 August 2018 в 21:47
поделиться
  • 1
    Ссылка на pxssh - приятное путешествие назад во времени. – Oben Sonne 3 February 2014 в 21:48

Все уже заявили (рекомендуется) с помощью paramiko, и я просто использую код python (API, который можно сказать), который позволит вам выполнять несколько команд за один раз.

для выполнения команд на разных Использование узла: Commands().run_cmd(host_ip, list_of_commands)

Вы увидите один TODO, который я сохранил, чтобы остановить выполнение, если какая-либо из команд не выполнена, я не знаю, как это сделать. пожалуйста, поделитесь своими знаниями

#!/usr/bin/python

import os
import sys
import select
import paramiko
import time


class Commands:
    def __init__(self, retry_time=0):
        self.retry_time = retry_time
        pass

    def run_cmd(self, host_ip, cmd_list):
        i = 0
        while True:
        # print("Trying to connect to %s (%i/%i)" % (self.host, i, self.retry_time))
        try:
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(host_ip)
            break
        except paramiko.AuthenticationException:
            print("Authentication failed when connecting to %s" % host_ip)
            sys.exit(1)
        except:
            print("Could not SSH to %s, waiting for it to start" % host_ip)
            i += 1
            time.sleep(2)

        # If we could not connect within time limit
        if i >= self.retry_time:
            print("Could not connect to %s. Giving up" % host_ip)
            sys.exit(1)
        # After connection is successful
        # Send the command
        for command in cmd_list:
            # print command
            print "> " + command
            # execute commands
            stdin, stdout, stderr = ssh.exec_command(command)
            # TODO() : if an error is thrown, stop further rules and revert back changes
            # Wait for the command to terminate
            while not stdout.channel.exit_status_ready():
                # Only print data if there is data to read in the channel
                if stdout.channel.recv_ready():
                    rl, wl, xl = select.select([ stdout.channel ], [ ], [ ], 0.0)
                    if len(rl) > 0:
                        tmp = stdout.channel.recv(1024)
                        output = tmp.decode()
                        print output

        # Close SSH connection
        ssh.close()
        return

def main(args=None):
    if args is None:
        print "arguments expected"
    else:
        # args = {'<ip_address>', <list_of_commands>}
        mytest = Commands()
        mytest.run_cmd(host_ip=args[0], cmd_list=args[1])
    return


if __name__ == "__main__":
    main(sys.argv[1:])

Спасибо!

4
ответ дан IAmSurajBobade 17 August 2018 в 21:47
поделиться

Посмотрите на spurplus, обертку, которую мы разработали вокруг spur, которая предоставляет аннотации типов и некоторые незначительные трюки (повторное подключение SFTP, md5 и т. д. .): https: // pypi.org/project/spurplus/

0
ответ дан Marko Ristin 17 August 2018 в 21:47
поделиться

Я нашел paramiko слишком низкоуровневым, а Fabric не особенно хорошо подходит для использования в качестве библиотеки, поэтому я собрал свою собственную библиотеку под названием spur , которая использует paramiko для реализации немного более удобный интерфейс:

import spur

shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = shell.run(["echo", "-n", "hello"])
print result.output # prints hello

Если вам нужно запустить внутри оболочки:

shell.run(["sh", "-c", "echo -n hello"])
13
ответ дан Michael Williamson 17 August 2018 в 21:47
поделиться
  • 1
    Я решил попробовать spur. Вы генерируете дополнительные команды оболочки, и в итоге вы получаете: which 'mkdir' & gt; / dev / null 2 ​​& amp; 1; echo $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Я также хотел бы иметь доступ к простой exec_command. Также отсутствует возможность запуска фоновых задач: nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &. Например, я генерирую zsh-скрипт (rpmbuildpackages) с использованием шаблона, а затем я просто оставил его на машине. Возможно, умение контролировать такие фоновые задания также было бы неплохо (сохранение PID в ~ ~ / .spur). – davidlt 7 February 2013 в 15:55
  • 2
    – Gabriel 5 June 2013 в 02:25
  • 3
    Не совсем верно: если вы используете предварительно скомпилированный установщик , вы сможете установить paramiko и spur. Я просто сделал это сам ... – ravemir 12 March 2014 в 18:58
  • 4
    @Gabriel: один из последних выпусков должен иметь улучшенную поддержку в Windows. Если он все еще не работает, не стесняйтесь открывать проблему. – Michael Williamson 25 August 2014 в 15:02
  • 5
    @davidlt: при создании SshShell теперь есть возможность установить тип оболочки. Если минимальная оболочка используется при передаче в shell_type=spur.ssh.ShellTypes.minimal, то отправляется только сырая команда. Внедрение фоновых задач напрямую ощущается немного из-за возможности Spur, но вы должны иметь возможность запускать описанную вами команду, вызывая оболочку, например. shell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]). – Michael Williamson 25 August 2014 в 15:04
24
ответ дан supersighs 17 August 2018 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: