zoukankan      html  css  js  c++  java
  • 解决 window 上python远程执行shell paramiko 命令 Permission denied

    1. 如果程序是在 Linux远程执行 , 那么遇到某些命令是不需要 再输入密码的

      但如果 python 是在本地 , 用  paramiko包 远程ssh登录执行命令 , 就会遇到需要输入密码

    2.解决办法 , 在windows上面  ssh-keygen -t rsa -C "abby@192.168.1.100" ,  公钥的作用域是远程 IP用户名 为'abby'

                 创建window 自己的公钥 , 其实相当于自己的指纹.

    把这个指纹 , 复制到远程 Linux的 公钥存放点

    (在window的公钥文件夹下执行复制命令 , 注意远程Linux里面根目录   ~ 代表的是用户 , /dir 代表的是 root的根目录

    scp ./id_rsa.pub abby@192.168.1.11:~/.ssh/windows_ras.pub       我这里是复制到用户.ssh里面 

     这个命令就是查看你复制到Linux的RSA 公钥并且写入到 Linux已确认免密登录公钥的文件中 , 他自己会创建 , 这样就可以window免密登录了 

    使用python的 ssh 功能就不用输入密码 ,我指的是启动某些命令需要

     cat windows_ras.pub >> authorized_keys             

    注意: scp 复制到Linux的 /  和~/  不是同一位置哦 , / 是root的免密 . ~/是 user的免密(说了两遍)

    Final: 贴上我 用python 上的 paramiko 包 远程 启动 hadoop实例 .以前是能登陆进去,但是执行命令会报要输入密码 ,

      另外,执行命令需要输入完整的路径名

    # -*- coding: utf-8 -*-
    # 批量操作linux服务器(执行命令,上传,下载)
    # !/usr/bin/python
    import paramiko
    import threading
    
    
    def ssh2(ip, username, passwd, cmd):
        try:
            paramiko.util.log_to_file('paramiko________.log')
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(ip, 22, username, passwd, timeout=5)
    
            stdin, stdout, stderr = ssh.exec_command(cmd)
    
            out = stdout.readlines()
            # outerr = stderr.readlines()
            # 屏幕输出
            print('执行完毕')
            for o in out:
                print(o),
    
                print('%s	OK
    ' % (ip))
            ssh.close()
        except:
            print('%s	Error
    ' % (ip))
    
    
    if __name__ == '__main__':
        #  cmd = ['ls -lh /export/servers/mysql/log/mysql.log']#你要执行的命令列表
        # 从文件读取命令
    
        cmd = "/home/abby/module/hadoop-2.6.0-cdh5.15.0/sbin/start-dfs.sh;"
        print("执行命令: ", cmd)
    
        username = "abby"  # 用户名  你是免密给哪个用户的 ,哪个用户才有权利不用 密码接待外宾
        passwd = "1"  # 单台服务器时启用----------------------
        ip = '192.168.1.11'  # 单台服务器时启用----------------------
    
        a = threading.Thread(target=ssh2, args=(ip, username, passwd, cmd))
        a.start()

    PS:  我们把window的 公钥比喻成一个客户 , 秘钥上传比作 行贿 , 你传给谁的  , 那么谁才能为你 开门 ,scp 的位置 , 作用的用户 就是你行贿的对象 

      你不能用行贿给 abby  , 开门却去找 root , 那样还是需要密码的 , 就算你把大门打开 , 核心通道你还是进不去 ,就像这里我行贿给 abby ,我用root 去登录 ,

      能登进去 , 但执行需要认证的命令肯定失败.

      所以我用 abby 登录上还是可以的 ,就算 root 的权限比abby 高也不行 . 我执行了   关闭 hadoop的命令 并且返回了 .

      通过这个 . . . 这也能执行一些脚本的 .反正不需要输密码 .

  • 相关阅读:
    2015-04
    2014-12
    2014-9
    nginx中ngx_http_ssl_module模块
    nginx中ngx_http_gzip_module模块
    Nginx中ngx_http_log_module模块
    Nginx中ngx_http_auth_basic_moudel和ngx_http_stub_status_module模块
    nginx中ngx_http_access_module模块
    nginx中ngx_http_core_module模块
    Nginx安装
  • 原文地址:https://www.cnblogs.com/alpha-cat/p/12861783.html
Copyright © 2011-2022 走看看