LinuxコンソールからWindowsコンピューターを管理する

ここでは、LinuxからWindowsでコンピューターを管理するタスクを検討しました。 winexeを使用して解決しました。



ソフトウェアをリモートでインストールし、ステータスを確認し、Windowsコンピューターの大規模なグループ(トレーニングクラス)をリモートでシャットダウン/再起動する同様のタスクを、Windows用sshサーバーfreeSSHdを使用して以下で解決します。



このサイトには、freeSSHd-1.3.1の最新バージョンのみが含まれています。 私にとっては不安定に動作します(サービスがクラッシュすることもあります)。 以前のバージョン(1.2.4)はXPからWin8.1で正常に動作しますが、 小さな悪用はありますが、FreeSSHDServiceサービスに失敗するだけのように見えるため、これに目を留めることができます。 念のため、このバージョンをここに入れてください (サイズ-782456)



インストーラーを起動します。その過程で、インストールパス(「C:\ Program Files(x86)\ FreeSSHD」)をC:\ bin \ FreeSSHDに変更します。異なるアーキテクチャのシステムで見つけるのが簡単で、設定はどこでも同じになります。 (C:\ binを最初に作成する必要があります。)



その後、すべてがデフォルトになります-最後に、FreeSSHDServiceサービスが開始されます。 トレイアイコンをクリックして設定できますが、完成した設定を設定ファイルC:\ bin \ FreeSSHD \ FreeSSHDService.iniにコピーして、サービスを再起動する方が簡単です。

FreeSSHDService.iniの例:
[Telnet server] TelnetListenAddress=0.0.0.0 TelnetListenPort=23 TelnetMaxConnections=0 TelnetTimeout=0 TelnetBanner= TelnetCMD=C:\Windows\system32\cmd.exe TelnetRun=0 TelnetNewConsole=1 [SSH server] SSHListenAddress=0.0.0.0 SSHListenPort=22 SSHMaxConnections=0 SSHTimeout=0 SSHBanner= SSHCMD=C:\Windows\system32\cmd.exe SSHRun=1 SSHNewConsole=1 SSHCiphers=0 SSHMACs=65535 SSHPasswordAuth=0 SSHPublickeyAuth=0 SSHPublickeyPath=C:\bin\freeSSHd\ RSAKeyPath=C:\bin\freeSSHd\RSAKey.cfg DSAKeyPath=C:\bin\freeSSHd\DSAKey.cfg [SSH tunneling] SSHLocalTunnel=0 SSHLocalTunnelOnly=0 SSHRemoteTunnel=0 SSHRemoteTunnelOnly=0 [SFTP] SFTPHomePath=$HOME\ [Access filtering] HostRestrictions= HostRestrictionsAllow=0 [Logging] LogEvents=0 LogFilePath=C:\bin\freeSSHd\freesshd.log LogResolveIP=0 [Automatic updates] UpdateCheckOnStartup=0 UpdateDontPrompt=0 UpdateShowMessages=1 UpdateLastMessageID=0 [Users] UserCount=1 [User0] Name=admin Auth=2 Password=000000000000000000000000000000000000000000 Domain= Shell=1 SFTP=1 Tunnel=1
      
      





ここで、宣言されたユーザーadminを再登録する必要があります。ファイルC:\ bin \ FreeSSHD \ adminを作成し、そこに公開キーを書き込みます。



または、既存のid_dsa.pubを使用するか、Linuxコンソールで次のように入力します

 /# ssh-keygen -t dsa
      
      





キーペア-id_dsaとid_dsa.pubを取得します

Windowsでは、id_dsa.pubをC:\ bin \ FreeSSHDディレクトリにコピーし、名前をC:\ bin \ FreeSSHD \ adminに変更します。



FreeSSHDServiceサービスを再起動します。

 net stop FreeSSHDService & net start FreeSSHDService
      
      







Linuxでは、接続をテストします(Cのルートをリストします:\):

 /# ssh -2q -i <my_key_files_path>/id_dsa -ladmin -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null <Win_Host_IP> "cmd /c dir c:\\"
      
      





ホストが接続を拒否した場合(おそらくwin7-win8上)、「Network Control Center ...」でファイアウォールを構成します。

Windowsファイアウォール->ネットワークのトラブルシューティング->着信接続->他の何か->参照-> C:\ bin \ FreeSSHD \ FreeSSHDService.exe



すべてがうまくいった場合は、ディレクトリC:\ bin \ FreeSSHD \を他のすべてのコンピューターにコピーします。インストール中にFreeSSHDの質問が少なくなり、構成済みの質問が開始されます。 もちろん、これらすべてを実行し、グループポリシーを介してファイアウォール構成を実装できますが、私は気にしませんでした-すべてのコンピューターは1つの成功したイメージから複製されました。



これで、どのコンピューターでも(ほぼ)任意のコマンドを実行できます。

たとえば、再起動:

 /# ssh -2q -i <my_key_files_path>/id_dsa -ladmin -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null <Win_Host_IP> "cmd /c shutdown /r /t 1"
      
      







インストール1(サイレント):

 /# ssh -2q -i <my_key_files_path>/id_dsa -ladmin -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null \ <Win_Host_IP> "cmd /c start \\\\<Server_IP>\\buh\\1Ccurrent\\setup /s"
      
      





アクセスはコンソールであるため、GUIを使用してプログラムを起動しようとすると、新しいウィンドウからの起動を使用する必要があります-「開始」。 1CのサイレントインストールにはGUIは必要ありませんが。



多くのコンピューターがある場合、コマンドを順番に実行するのは非効率的であり、セッションを分岐する必要があります。

192.168.0.210〜192.168.0.220の範囲のコンピューターをポーリングし、その名前を/tmp/rexec.logログに書き込むPythonのデモプログラム。 非応答者はNAとしてマークされ、セッションのハングはTですか?T:

 #!/usr/bin/python # -*- coding: utf-8 -*- log = '/tmp/rexec.log' host_range = range(210,220) ip_first_3 = '192.168.0' my_key = '/root/.ssh/id_dsa' my_cmd = 'hostname' #  #my_cmd = 'shutdown /s /t 10' # #my_cmd = r'\\\\srv1\\shar1\\mycmd.bat' #       import os,sys,time,subprocess from datetime import datetime try: cmd = '/usr/bin/ssh -2q -oBatchMode=yes -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i%s -ladmin %s.%%d "cmd /c %s " ' % (my_key,ip_first_3,my_cmd) procs,out,err = [],[],[] for x in host_range: xcmd = cmd % x procs.append([x,subprocess.Popen(xcmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True,bufsize=4096,executable='/bin/bash')]) for i in range(0,20): #20   1  stop = True for proc in procs: # print i, proc[0] if proc[0] == 0: continue try: res = proc[1].poll() if res == None: stop = False continue if res == 0: out.append("%d:%s" % (proc[0],proc[1].stdout.read().splitlines()[0])) #  1   ! else: err.append("%d:NA" % proc[0]) except: err.append("%d:EX" % proc[0]) proc[0]=0 if stop: break time.sleep(1) if not stop: #   for proc in procs: if proc[0] != 0: proc[1].terminate() err.append("%d:?T" % proc[0]) s = "%s|%s" % ('; '.join(out),'; '.join(err)) except: s = "!!! Error" print s with open(log, "ab") as fp: fp.write("--- %s cmd=%s\n" % (datetime.strftime(datetime.now(), "%Y.%m.%d %H:%M:%S"),my_cmd)) fp.write(" Result: %s\n" % s)
      
      





(元のプログラムはCGIスクリプトであったため、最小限の出力です)



複雑で長いコマンドは、バッチファイルとして最適化され、アクセス可能なネットワークパスに配置されます。 Sambaリソースで、ファイルの実行を許可し、Windowsのスタイルで行末を作成する必要があります。



All Articles