পাইথনের সাথে এসএসএসের মাধ্যমে কমান্ডগুলি সম্পাদন করুন


136

আমি পাইথনে কিছু কমান্ড লাইন কমান্ড স্বয়ংক্রিয় করতে একটি স্ক্রিপ্ট লিখছি। এই মুহূর্তে আমি এইভাবে কল করছি:

cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)

তবে আমার একটি রিমোট মেশিনে কিছু কমান্ড চালানো দরকার। ম্যানুয়ালি, আমি ssh ব্যবহার করে লগ ইন করব এবং তারপরে কমান্ডগুলি চালিত করব। পাইথনে আমি কীভাবে এটি স্বয়ংক্রিয় করব? আমাকে দূরবর্তী মেশিনে একটি (পরিচিত) পাসওয়ার্ড দিয়ে লগ ইন করতে হবে, তাই আমি কেবল ব্যবহার করতে পারি না cmd = ssh user@remotehost, আমি ভাবছি যে আমার কোনও মডিউল ব্যবহার করা উচিত কিনা?

উত্তর:


201

আমি আপনাকে পরমিকো রেফার করব

দেখতে এই প্রশ্নের

ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd_to_execute)

3
এখানে অনুমান করা হচ্ছে যে পরমিকো (ওপেন) এসএসএসের মতো সুরক্ষিত। তাই কি?
ব্যবহারকারী 239558

1
ssh- কী বিনিময় হয় কি?
আর্দিত

19
আপনি যদি এসএসএইচ কী ব্যবহার করছেন তবে প্রথমে EITHER: k = paramiko.RSAKey.from_private_key_file(keyfilename)OR 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)
স্কট প্রাইভ

7
দীর্ঘকালীন প্যারামিকো ব্যবহারকারী (তবে কোনও বিশেষজ্ঞ নয়) হিসাবে আমি প্যারামিকো ব্যবহারের পরামর্শ দিতে পারি তবে আপনার ব্যবহারের ক্ষেত্রে এবং আপনি কতটা জানতে আগ্রহী তা বিবেচনা করা উচিত। প্যারামিকো খুব নিম্ন-স্তরের এবং আপনি সহজেই একটি ফাঁদে পড়ে যেতে পারেন যেখানে আপনি যে কোডটি ব্যবহার করছেন তা পুরোপুরি না বুঝে আপনি একটি "কমান্ড চলমান সহায়ক ফাংশন" তৈরি করেন। এর অর্থ আপনি def run_cmd(host, cmd):প্রথমে যা বলতে চান তা করতে ডিজাইন করতে পারেন তবে আপনার প্রয়োজনগুলি বিকশিত হয়। আপনি নতুন ব্যবহারের ক্ষেত্রে সহায়কটিকে পরিবর্তন করবেন, যা পুরানো বিদ্যমান ব্যবহারের আচরণকে পরিবর্তন করে। সেই অনুযায়ী পরিকল্পনা.
স্কট প্রাইভ

3
অজানা হোস্ট ত্রুটির জন্য, করুন: ssh.set_missing_host_key_policy (প্যারামিকো.আউটআডডপলিসি ()) এর আগে
নিমো

48

অথবা আপনি কেবল কমান্ড ব্যবহার করতে পারেন ge গেস্টটাস আউটপুট :

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

আমি এটি ব্যাপকভাবে ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে।

পাইথন ২.6++ এ ব্যবহার করুন subprocess.check_output


4
একটি দুর্দান্ত সাধারণ অন্তর্নির্মিত পদ্ধতির জন্য +1। আমার বর্তমান সেটআপে আমি পাইথন লাইব্রেরি যুক্ত করতে চাই না যাতে আপনার পরামর্শটি মূল্যবান, খুব সোজাও।
ফিলিপ কেয়ার্নস

3
কেবল নিশ্চিত করুন যে আপনার দূরবর্তী হোস্টটি পাসওয়ার্ডহীন
এসএসের

সাবপ্রোসেস.সেক_আউটপুট - দুর্দান্ত সমাধান!
টিম এস

2
@ পাওয়ারওয়ার্স এই "অন্যান্য জিনিসগুলি" কী?
ইলেওন

2
@TimS। আপনার সেটআপের জন্য যথাযথ যে কোনও উপায়ে প্রমাণীকরণের জন্য আপনাকে হ্যান্ডলিং অন্তর্ভুক্ত থাকতে পারে। আমি প্রম্পটে পাসওয়ার্ড প্রবেশের প্রত্যাশাকে ব্যবহার করেছি। তারপরে অন্যান্য সমাধানগুলির সাথে এই থ্রেডটি রয়েছে: unix.stackexchange.com/questions/147329/…
পাওয়ারপক্স

29

আপনি কি ফ্যাব্রিক তাকান ? এটি আপনাকে অজগর ব্যবহার করে এসএসএইচ দিয়ে সমস্ত ধরণের রিমোট স্টাফ করার অনুমতি দেয়।


18

আমি প্যারামিকোকে কিছুটা নিচু স্তরের বলে খুঁজে পেয়েছি এবং ফ্যাব্রিক গ্রন্থাগার হিসাবে ব্যবহার করার পক্ষে বিশেষভাবে উপযুক্ত নয়, তাই আমি আমার নিজের লাইব্রেরিটি স্পার নামক একসাথে রেখেছি যা সামান্য সুন্দর ইন্টারফেস প্রয়োগ করতে প্যারামিকো ব্যবহার করে:

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"])

2
আমি চেষ্টা করার সিদ্ধান্ত নিয়েছে spur। আপনি অতিরিক্ত শেল কমান্ড জেনারেট করেন এবং এতে আপনার শেষ হয়: যা 'mkdir'> / dev / null 2> & 1; প্রতিধ্বনি $ ?; এক্সিকিউটর 'এমকেডির' '-পি' '/ ডেটা / আরপিএমআপডেট / 20130207142923'। আমি একটি সমতলে অ্যাক্সেস করতে চাই exec_command। এছাড়াও ব্যাকগ্রাউন্ড টাস্ক চালানোর ক্ষমতা অনুপস্থিত: nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &। উদাহরণস্বরূপ, আমি টেমপ্লেট ব্যবহার করে একটি zsh স্ক্রিপ্ট (rpmbuildpackages) উত্পন্ন করি এবং তারপরে আমি কেবল এটি মেশিনে চালিয়ে যেতে পারি। সম্ভবত এই জাতীয় ব্যাকগ্রাউন্ড জবগুলি নিরীক্ষণ করার ক্ষমতাটিও দুর্দান্ত হবে (কিছু। / .Spur এ পিআইডি সংরক্ষণ করা)।
ডেভিডল্ট

1
spurদৃশ্যত কেবল ইউনিক্স সিস্টেমে কাজ করে কারণ এর উপর নির্ভরতা রয়েছে termios। কেউ কি উইন্ডোজের জন্য একটি ভাল গ্রন্থাগার জানেন?
গ্যাব্রিয়েল

সম্পূর্ণ সত্য নয়: আপনি যদি পূর্বনির্ধারিত ইনস্টলার ব্যবহার করেন তবে আপনি প্যারামিকো এবং স্পার ইনস্টল করতে সক্ষম হবেন। আমি কেবল এটি নিজেই করেছি ...
রাভেমির

@ গ্যাব্রিয়েল: সাম্প্রতিক রিলিজগুলির মধ্যে একটিতে উইন্ডোজটিতে উন্নত সমর্থন হওয়া উচিত। যদি এটি এখনও কাজ না করে, দয়া করে কোনও সমস্যা খোলার জন্য নির্দ্বিধায়।
মাইকেল উইলিয়ামসন

@ ডেভিডল্ট: একটি নির্মাণের SshShellসময় শেল টাইপ সেট করার বিকল্প এখন রয়েছে। যদি কোনও নূন্যতম শেল প্রবেশ করে ব্যবহার করা হয় shell_type=spur.ssh.ShellTypes.minimal, তবে কেবলমাত্র কাঁচা কমান্ড প্রেরণ করা হবে। ব্যাকগ্রাউন্ড টাস্কগুলি কার্যকর করা স্পারটির জন্য কিছুটা সুযোগ ছাড়াই সরাসরি অনুভূত হয় তবে শেল উদযাপন করে আপনি যে কমান্ডটি বর্ণনা করেছেন তা চালাতে সক্ষম হওয়া উচিত shell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"])।
মাইকেল উইলিয়ামসন

18

সহজবোধ্য রাখো. কোন গ্রন্থাগার প্রয়োজন।

import subprocess

subprocess.Popen("ssh {user}@{host} {cmd}".format(user=user, host=host, cmd='ls -l'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

1
সাবপ্রোসেস হ'ল অটোমেশনে আপনার সুইস সেনা ছুরি। তারপরে আপনি পাইথনকে শেল স্ক্রিপ্টস, সেড, অ্যাজক, গ্রেপের মতো অন্তহীন সম্ভাবনার সাথে একত্রিত করতে পারেন। হ্যাঁ আপনি সবাই পাইথনে করতে পারেন, তবে পাইথনকে কোথাও একটি গ্রেপ চালানো দুর্দান্ত হবে না - ভাল আপনি পারেন।
রন ম্যাক

12
যদি আপনার ssh কমান্ডগুলি পাসওয়ার্ডের জন্য জিজ্ঞাসা করে আপনি কীভাবে পাইথন ফাইলটিতে এটি সরবরাহ করবেন?
বিইংসমান

1
@ বিজনসুমান আপনি এর জন্য এসএসএইচ কী প্রমাণীকরণ ব্যবহার করতে পারেন। যদিও আমি অনুমান করি আপনি ইতিমধ্যে এটি বুঝতে পেরেছেন।
এমএমবুলবুল

9

সবাই ইতিমধ্যে প্যারামিকো ব্যবহার করে প্রস্তাবিত (প্রস্তাবিত) এবং আমি কেবল একটি পাইথন কোড (এপিআই বলতে পারে) ভাগ করে নিচ্ছি যা আপনাকে একযোগে একাধিক কমান্ড কার্যকর করতে দেয়।

বিভিন্ন নোড ব্যবহারে কমান্ড কার্যকর করতে: Commands().run_cmd(host_ip, list_of_commands)

আপনি একটি টোডো দেখতে পাবেন, যা আমি কার্যকর করার জন্য আটকে রেখেছি যদি কোনও কমান্ড কার্যকর করতে ব্যর্থ হয় তবে আমি কীভাবে এটি করব তা জানি না। আপনার জ্ঞান শেয়ার করুন

#!/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

আমি পরমিকোকে একটি গুচ্ছ (চমৎকার) এবং pxssh (খুব সুন্দর) ব্যবহার করেছি। আমি সুপারিশ করব। এগুলি কিছুটা আলাদাভাবে কাজ করে তবে ব্যবহারে তুলনামূলকভাবে বড় ওভারল্যাপ থাকে।


4
Pxssh এর লিঙ্কটি সময় মতো ফিরে আসা একটি দুর্দান্ত যাত্রা।
ওবেন সোন

3

paramiko পরিশেষে অতিরিক্ত লাইন, যা সত্যিই গুরুত্বপূর্ণ এক (লাইন 3) হয় যোগ করার পরে আমার জন্য কাজ:

import paramiko

p = paramiko.SSHClient()
p.set_missing_host_key_policy(paramiko.AutoAddPolicy())   # This script doesn't work for me unless this line is added!
p.connect("server", port=22, username="username", password="password")
stdin, stdout, stderr = p.exec_command("your command")
opt = stdout.readlines()
opt = "".join(opt)
print(opt)

নিশ্চিত করুন যে প্যারামিকো প্যাকেজ ইনস্টল করা আছে। সমাধানের মূল উত্স: উত্স


1
#Reading the Host,username,password,port from excel file
import paramiko 
import xlrd

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

loc = ('/Users/harshgow/Documents/PYTHON_WORK/labcred.xlsx')
wo = xlrd.open_workbook(loc)
sheet = wo.sheet_by_index(0)
Host = sheet.cell_value(0,1)
Port = int(sheet.cell_value(3,1))
User = sheet.cell_value(1,1)
Pass = sheet.cell_value(2,1)

def details(Host,Port,User,Pass):
    ssh.connect(Host, Port, User, Pass)
    print('connected to ip ',Host)
    stdin, stdout, stderr = ssh.exec_command("")
    stdin.write('xcommand SystemUnit Boot Action: Restart\n')
    print('success')

details(Host,Port,User,Pass)

1

পুরোপুরি কাজ করে ...

import paramiko
import time

ssh = paramiko.SSHClient()
#ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.106.104.24', port=22, username='admin', password='')

time.sleep(5)
print('connected')
stdin, stdout, stderr = ssh.exec_command(" ")

def execute():
       stdin.write('xcommand SystemUnit Boot Action: Restart\n')
       print('success')

execute()

1

গৃহীত উত্তরটি আমার পক্ষে কার্যকর হয়নি, আমি পরিবর্তে যা ব্যবহার করেছি তা এখানে:

import paramiko
import os

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# ssh.load_system_host_keys()
ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
ssh.connect("d.d.d.d", username="user", password="pass", port=22222)

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -alrt")
exit_code = ssh_stdout.channel.recv_exit_status() # handles async exit error 

for line in ssh_stdout:
    print(line.strip())

total 44
-rw-r--r--.  1 root root  129 Dec 28  2013 .tcshrc
-rw-r--r--.  1 root root  100 Dec 28  2013 .cshrc
-rw-r--r--.  1 root root  176 Dec 28  2013 .bashrc
...

বিকল্পভাবে, আপনি sshpass ব্যবহার করতে পারেন :

import subprocess
cmd = """ sshpass -p "myPas$" ssh user@d.d.d.d -p 22222 'my command; exit' """
print( subprocess.getoutput(cmd) )

তথ্যসূত্র:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495


0

আমাদের spurplusচারপাশে তৈরি করা একটি র‍্যাপারটি দেখুন , spurযা টাইপ টীকাগুলি এবং কিছু ছোটখাটো কল্পনা সরবরাহ করে (এসএফটিপি, এমডি 5 ইত্যাদি পুনঃসংযোগ করে ): https://pypi.org/project/spurplus/


1
একটি মোড়কের চারপাশে একটি মোড়কের চারপাশে একটি মোড়ক .. চমৎকার :)
অ্যালেক্স আর

ঠিক আছে, আপনি যদি আপনার স্থাপনার স্ক্রিপ্টগুলি তুচ্ছ রাখতে চান তবে আমি সন্দেহ করি যে অন্তর্নিহিত সরঞ্জামগুলি যথেষ্ট সরল / বিমূর্ত। এখনও অবধি, আমরা ফাঁসী বিমূর্ততা পালন করি নি।
marko.ristin

0

ব্যবহারকারীরা যে লগ ইন করছেন সে অনুযায়ী কমান্ডটি প্রবেশ করতে অনুরোধ করুন
below নীচের কোডটি PEP8online.com দ্বারা বৈধ করা হয়েছে।

import paramiko
import xlrd
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
loc = ('/Users/harshgow/Documents/PYTHON_WORK/labcred.xlsx')
wo = xlrd.open_workbook(loc)
sheet = wo.sheet_by_index(0)
Host = sheet.cell_value(0, 1)
Port = int(sheet.cell_value(3, 1))
User = sheet.cell_value(1, 1)
Pass = sheet.cell_value(2, 1)

def details(Host, Port, User, Pass):
    time.sleep(2)
    ssh.connect(Host, Port, User, Pass)
    print('connected to ip ', Host)
    stdin, stdout, stderr = ssh.exec_command("")
    x = input('Enter the command:')
    stdin.write(x)
    stdin.write('\n')
    print('success')

details(Host, Port, User, Pass)

0

উদাহরণস্বরূপ, যদি আপনি হোস্ট-নেম, ব্যবহারকারীর নাম, পাসওয়ার্ড এবং নং পোর্টের জন্য ব্যবহারকারী ইনপুট চান তবে অন্তর্ভুক্ত করুন।

  import paramiko

  ssh = paramiko.SSHClient()

  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())



  def details():

  Host = input("Enter the Hostname: ")

  Port = input("Enter the Port: ")

  User = input("Enter the Username: ")

  Pass = input("Enter the Password: ")

  ssh.connect(Host, Port, User, Pass, timeout=2)

  print('connected')

  stdin, stdout, stderr = ssh.exec_command("")

  stdin.write('xcommand SystemUnit Boot Action: Restart\n')

  print('success')

  details()

5
আরও ভাল ফর্ম্যাটিং দিয়ে আপনার উত্তরটি দু'দিন আগে পুনরায় পোস্ট করার পরিবর্তে, কেন পুরানো উত্তরটি সম্পাদনা করে এর বিন্যাসটি উন্নত করবেন না?
snakecharmerb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.