{"id":303,"date":"2017-11-07T14:39:25","date_gmt":"2017-11-07T16:39:25","guid":{"rendered":"http:\/\/megumijr.com\/blog\/?page_id=303"},"modified":"2017-11-07T15:08:38","modified_gmt":"2017-11-07T17:08:38","slug":"remoteoff","status":"publish","type":"page","link":"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/remoteoff\/","title":{"rendered":"RemoteOff"},"content":{"rendered":"<p>Esse script executa o desligamento remoto (shutdown) de servidores Windows ou Linux atrav\u00e9s da execu\u00e7\u00e3o remota de comandos via SSH. O desligamento pode ser feito em um servidor ou em todos os servidores cadastrados no arquivo de configura\u00e7\u00e3o.<\/p>\n<h3>READ-ME<\/h3>\n<pre>RemoteOff\r\n=========\r\nShutdown remoto de servidores.\r\n\r\n\r\nSERVIDORES LINUX\r\n================\r\n\r\nPreparando servidores\r\n---------------------\r\n* Permitir que usu\u00e1rios n\u00e3o root fa\u00e7am shutdown\r\n\r\n  - Adicionar o grupo shutdown:\r\n    $ sudo groupadd shutdown\r\n\r\n  - Adicionar usu\u00e1rio ao grupo shutdown:\r\n    $ sudo usermod -a -G shutdown \r\n\r\n  - Configurar o 'sudo' para dar permiss\u00e3o aos usu\u00e1rios do grupo 'shutdown':\r\n    $ sudo visudo\r\n\r\n  - Adicionar ao final do arquivo aberto pelo 'visudo', as linhas abaixo:\r\n    %shutdown ALL=(root) NOPASSWD: \/sbin\/reboot\r\n    %shutdown ALL=(root) NOPASSWD: \/sbin\/poweroff\r\n    %shutdown ALL=(root) NOPASSWD: \/sbin\/shutdown\r\n\r\n  - No RedHat, comentar a linha que cont\u00e9m \"Defaults requiretty\" no mesmo arquivo.\r\n\r\n* OBS: Para que o  fa\u00e7a shutdown, ele deve usar 'sudo', mas n\u00e3o ser\u00e1 pedida nenhuma senha:\r\n  $ sudo shutdown -h now\r\n\r\n\r\nSERVIDORES WINDOWS\r\n==================\r\n\r\nPreparando servidores\r\n---------------------\r\n* Instalar servidor SSH: OpenSSH ou freeSSHd\r\n  - freeSSHd: http:\/\/www.freesshd.com\/?ctt=download         (mais simples de configurar)\r\n  - OpenSSH:  http:\/\/sshwindows.sourceforge.net\/download\/   (OpenSSH portado com Cygwin m\u00ednimo)\r\n\r\n\r\nARQUIVO DE CONFIGURA\u00c7\u00c3O\r\n=======================\r\n\r\n* Criar ou editar o arquivo \"remoteoff.conf\", uma linha por servidor, com as seguintes informa\u00e7\u00f5es:\r\n  # IP.........: Endere\u00e7o IP do servidor remoto\r\n  # PORT.......: N\u00famero da porta do ssh no serv. remoto \r\n  # USER.......: Login do usu\u00e1rio ssh no serv. remoto\r\n  # PASSWD.....: Senha do usu\u00e1rio ssh no serv. remoto\r\n  # DELAY......: Tempo de espera em segundos antes de exec. o comando.\r\n  # CMD........: Comando a ser executado no serv. remoto.\r\n\r\n* Exemplo de arq. de configura\u00e7\u00e3o (10.0.0.1 -&gt; Linux; 10.0.0.2 -&gt; Windows):\r\n  # IP           PORT  USER     PASSWD    DELAY CMD\r\n  # ------------ ----- -------- --------- ----- -------------------\r\n    10.0.0.1     22    user     user      0     sudo poweroff\r\n    10.0.0.2     22    suporte  suporte   0     shutdown -s -t 0\r\n\r\n* IMPORTANTE: chmod 700 remoteoff.conf\r\n  ^^^^^^^^^^\r\n\r\n\r\nEXECUTANDO SCRIPT\r\n=================\r\n* Para executar shutdown em todos os servidores:\r\n  $ .\/remoteoff -s all\r\n\r\n* Para executar shutdown em um servidor somente:\r\n  $ .\/remoteoff -s 10.0.0.1\r\n<\/pre>\n<hr \/>\n<h3>C\u00d3DIGO<\/h3>\n<pre>#!\/usr\/bin\/python\r\n# -*- coding: UTF-8 -*-\r\n# Programa: remoteoff\r\n# Fun\u00e7\u00e3o: Realiza shutdown em todos os servidores.\r\nVERSION = \"1.0\"\r\n#\r\n# Arquivo de configura\u00e7\u00e3o: arquivo texto contendo as seguintes \r\n#    informa\u00e7\u00f5es para cada servidor, um servidor por linha.\r\n# IP.........: Endere\u00e7o IP do servidor remoto\r\n# PORT.......: N\u00famero da porta do ssh no serv. remoto\r\n# USER.......: Login do usu\u00e1rio ssh no serv. remoto\r\n# PASSWD.....: Senha do usu\u00e1rio ssh no serv. remoto\r\n# DELAY......: Tempo de espera em segundos antes de exec. o comando.\r\n# CMD........: Comando a ser executado no serv. remoto.\r\n#\r\n# OBS1: SUDO deve ser configurado para executar \"shutdown\" ou \"poweroff\"\r\n#       sem pedir senha.\r\n#\r\n# OBS2: Pode ser adicionado um coment\u00e1rio no final de cada linha\r\n#       usando caracter \"#\".\r\n#\r\n# IMPORTANTE: chmod 700 remoteoff.conf\r\n#\r\n# Exemplo de arq. de configura\u00e7\u00e3o\r\n## IP        PORT USER     PASSWD   DELAY CMD\r\n## --------- ---- -------- -------- ----- -------------------\r\n#  10.0.0.1  22   user     user     0     sudo poweroff\r\n#  10.0.0.2  22   suporte  suporte  0     shutdown -s -t 0\r\n\r\nimport os, sys, time\r\nimport getopt\r\nimport paramiko                       # apt-get install python-paramiko\r\n\r\n#Vari\u00e1veis globais\r\nCONF_FILE = \"remoteoff.conf\"          # Nome do arquivo conf\r\nTEST = False\r\nSERVER = None\r\n\r\n# Para debug...\r\n# paramiko.util.log_to_file('remoteoff.log')\r\n\r\ndef main():\r\n   global TEST, SERVER\r\n\r\n   #Obtem argumentos\r\n   getArgs()\r\n   \r\n   #In\u00edcio\r\n   #printLogMsg(\"Inicio de execucao.\")\r\n\r\n   #Remove arquivos antigos\r\n   shutdownServers(TEST, SERVER, CONF_FILE)\r\n   \r\n   #Fim\r\n   #printLogMsg(\"Fim de execucao.\")\r\n#end main\r\n\r\n\r\ndef getArgs():\r\n   \"\"\"Obtem e faz consist\u00eancia dos argumentos\"\"\"\r\n   global TEST, SERVER\r\n\r\n   #Captura par\u00e2metros\r\n   try:\r\n      opts, args = getopt.getopt(sys.argv[1:], \"hts:\", \\\r\n         [\"help\", \"test\", \"server=\"])\r\n   except getopt.GetoptError, err:\r\n      # Exibe ajuda e encerra:\r\n      print str(err) # exibe algo como \"option -a not recognized\"\r\n      usage()\r\n      sys.exit(2)\r\n   #endTry\r\n   \r\n   #Trata op\u00e7\u00f5es\r\n   SERVER = None\r\n   for o, a in opts:\r\n      if o in (\"-h\", \"--help\"):\r\n         usage()\r\n         sys.exit()\r\n      elif o in (\"-t\", \"--test\"):\r\n         TEST = True\r\n      elif o in (\"-s\", \"--server\"):\r\n         SERVER = a\r\n      else:\r\n         assert False, \"unhandled option\"\r\n   #endfor\r\n   \r\n   #Verifica argumentos\r\n   errmsg = \"\"\r\n   if (opts == []): #Se n\u00e3o houver parametro nenhum...\r\n      errmsg = \"missing options\"\r\n   else:\r\n      if (SERVER == None):\r\n         errmsg = \"missing option: -s\"\r\n      #endIf\r\n   #endIf\r\n   if (errmsg != \"\"):\r\n      print errmsg\r\n      usage()\r\n      sys.exit(2)\r\n   #endIf\r\n#endDef   \r\n\r\n\r\ndef usage():\r\n   \"\"\"Exibe help\"\"\"\r\n   global VERSION\r\n   print \r\n   print \"RemonteOff v\", VERSION\r\n   print\r\n   print \"Uso: remoteoff [-h]|[[-t] -s {IP}|all]\"\r\n   print \r\n   print \"Realiza shutdown em um ou todos servidores remotos, \"\r\n   print \"conforme especificado no arquivo remoteoff.conf\"\r\n   print\r\n   print \"Op\u00e7\u00f5es:\"\r\n   print \"-h, --help    Exibe o help de comandos.\"\r\n   print \"-s, --server  Endere\u00e7o IP do servidor desejado ou 'all' para todos.\"\r\n   print \"-t, --test    Exibe os comandos que ser\u00e3o executados.\"\r\n   print\r\n   print \"Exemplo:\"\r\n   print 'remoteoff -s all'\r\n   print\r\n#endDef\r\n\r\ndef shutdownServers(test, server, confFile):\r\n   \"\"\"Realiza shutdown do servidor especificado.\"\"\"\r\n   serverFound = False\r\n   \r\n   # Abre arquivo de configura\u00e7\u00e3o\r\n   conf = os.path.dirname(sys.argv[0]) + \"\/\" + confFile\r\n   fconf = open(conf)\r\n   \r\n   # Cria objeto SSH\r\n   ssh = paramiko.SSHClient()\r\n   ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())\r\n\r\n   #Processa lista de servidores\r\n   for line in fconf:\r\n      # Linha do arquivo conf:\r\n      # IP, PORT, USER, PASSWD, DELAY, CMD \r\n      ln = line.split()\r\n      if (len(ln) &gt; 0) and (ln[0] != \"#\"):\r\n         ip    = ln[0]                   # host remoto\r\n         dport = int(ln[1])              # porta ssh\r\n         usr   = ln[2]                   # usuario ssh\r\n         pwd   = ln[3]                   # senha do usuario ssh\r\n         dly   = float(ln[4])            # retardo para execu\u00e7\u00e3o\r\n         cmd   = \" \".join(ln[5:len(ln)]) # junta texto do comando\r\n         cmd   = cmd[0:cmd.find(\"#\")]    # remove coment\u00e1rios do final\r\n         \r\n         # Processa servidor da lista\r\n         if (server == 'all') or (server == ip):\r\n            serverFound = True\r\n            print\r\n            \r\n            # Aguarda delay especificado\r\n            if (dly &gt; 0):\r\n               printLogMsg(\"Aguardando %s seg...\" % (dly))\r\n               time.sleep(dly)\r\n            #endIf\r\n            \r\n            # Executa comando\r\n            if (test == True):\r\n               printLogMsg(\"Teste: %s\" % (ip))\r\n\r\n            else:\r\n               printLogMsg(\"Executando em %s: %s\" % (ip, cmd))\r\n               \r\n               try:\r\n                  ssh.connect(ip, port=dport, username=usr, password=pwd)\r\n               except:\r\n                  printLogMsg(\"Erro ao conectar em %s!!\" % (ip))\r\n                  continue\r\n               #endTry\r\n               \r\n               try:\r\n                  # Executa comando\r\n                  stdin, stdout, stderr = ssh.exec_command(cmd)\r\n               except:\r\n                  printLogMsg(\"Erro ao executar comando %s\" % (cmd))\r\n                  pass\r\n               #endTry\r\n\r\n               # Mostra sa\u00edda.\r\n               for l in stdout.readlines():\r\n                  print l.replace(\"\\n\", \" \")\r\n               #endFor\r\n               \r\n               ssh.close()\r\n            #endIf\r\n         #endIf\r\n      #endIf\r\n   #endFor\r\n\r\n   if (serverFound == False):\r\n      printLogMsg(\"Servidor %s nao configurado.\" % (server))\r\n   #endIf\r\n   fconf.close()\r\n   print\r\n   \r\n#end shutdownServers   \r\n\r\n\r\n#----- Fun\u00e7\u00f5es Genericas -----------------------------------------------------\r\n\r\ndef printLogMsg(msg):\r\n   \"\"\"Imprime mensagem de log com data e hora correntes.\"\"\"\r\n   t = time.localtime(time.time())\r\n   lmsg = \"%02d\/%02d\/%d %02d:%02d - %s\" % (t[2], t[1], t[0], t[3], t[4], msg)\r\n   print lmsg\r\n   sys.stdout.flush()\r\n   return\r\n#end printLogMsg\r\n\r\n\r\nif __name__ == \"__main__\":\r\n   main()\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h3>remoteoff.conf (exemplo)<\/h3>\n<pre># IP             PORT  USER      PASSWD      DELAY CMD\r\n# -------------- ----- --------- ----------- ----- --------------------------------\r\n 10.0.0.1        22    user      user        0     sudo poweroff\r\n 10.0.0.2        22    suporte   suporte     0     shutdown -s -t 0<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esse script executa o desligamento remoto (shutdown) de servidores Windows ou Linux atrav\u00e9s da execu\u00e7\u00e3o remota de comandos via SSH. O desligamento pode ser feito em um servidor ou em todos os servidores cadastrados no arquivo de configura\u00e7\u00e3o. READ-ME RemoteOff ========= Shutdown remoto de servidores. SERVIDORES LINUX ================ Preparando servidores \u2026 <a class=\"continue-reading-link\" href=\"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/remoteoff\/\">Continue lendo <span class=\"meta-nav\">&rarr; <\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":292,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/303"}],"collection":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/comments?post=303"}],"version-history":[{"count":2,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/303\/revisions"}],"predecessor-version":[{"id":309,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/303\/revisions\/309"}],"up":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/292"}],"wp:attachment":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/media?parent=303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}