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\tOK\n' % (ip)) ssh.close() except: print('%s\tError\n' % (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的命令 並且返回了 .
通過這個 . . . 這也能執行一些腳本的 .反正不需要輸密碼 .