web-dev-qa-db-ja.com

sshに相当するWindows-リモートマシンに接続してコマンドラインにアクセスする方法

* nixマシン用に設計されたフレームワークをWindowsに拡張するためのソリューションを考え出すのに苦労しています。フレームワークは現在、1つの* nixサーバーから他の* nixサーバーにsshを実行し、ログファイルの確認、ソース管理からのファイルの同期、ソース管理へのログの送信など、さまざまなコマンドを実行します。立ち往生しているのは、リモートのWindowsマシンに接続してコマンドラインにアクセスする方法です。接続は別のWindowsマシンからも可能です。UNIXマシンから開始する必要はありません。UNIXからWindowsではなくWindowsからWindowsに接続できます。

以下は、UNIXシステムでコマンドが現在どのように実行されるかの例です。このようなものは、サーバー名のリストを通過するループにあります。 Windowsマシンで実行するには、このようなものが必要です。

ssh ${user}@${server} "cd /app/app_name/logs; <export source control params>; <submit logs to source control>" >> Log.txt

また、サードパーティのツールを使用したくない(予算は約0ドル)。私はPsExecと他のいくつかをチェックアウトしましたが、管理者アクセスが必要であるか、ユーザーを渡す/プレーンテキストで渡す必要があるようです。

19
user797963

Powershell Remotingを使用する: https://msdn.Microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

恥知らずにコピー貼り付け:

Windows PowerShellリモート処理

WS-Managementプロトコルを使用するWindows PowerShellリモート処理を使用すると、1つまたは複数のリモートコンピューターで任意のWindows PowerShellコマンドを実行できます。永続的な接続を確立し、1対1の対話型セッションを開始し、複数のコンピューターでスクリプトを実行できます。 Windows PowerShellリモート処理を使用するには、リモートコンピューターがリモート管理用に構成されている必要があります。 Windows PowerShellリモート処理を構成すると、多くのリモート処理戦略を利用できるようになります。このドキュメントの残りの部分では、それらのほんの一部をリストしています。

インタラクティブセッションを開始する

単一のリモートコンピューターとの対話型セッションを開始するには、Enter-PSSessionコマンドレットを使用します。たとえば、Server01リモートコンピューターとの対話型セッションを開始するには、次のように入力します。

Enter-PSSession Server01

コマンドプロンプトが変わり、接続しているコンピューターの名前が表示されます。それ以降、プロンプトで入力したコマンドはすべてリモートコンピューターで実行され、結果がローカルコンピューターに表示されます。

インタラクティブセッションを終了するには、次のように入力します。

Exit-PSSession

リモートコマンドを実行する

1つまたは複数のリモートコンピューターでコマンドを実行するには、Invoke-Commandコマンドレットを使用します。たとえば、Server01およびServer02リモートコンピューターでGet-UICultureコマンドを実行するには、次のように入力します。

invoke-command -computername Server01, Server02 {get-UICulture}

出力がコンピューターに返されます。

LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

スクリプトを実行する

1つまたは複数のリモートコンピューターでスクリプトを実行するには、Invoke-CommandコマンドレットのFilePathパラメーターを使用します。スクリプトはローカルコンピュータ上にあるか、ローカルコンピュータからアクセスできる必要があります。結果はローカルコンピュータに返されます。

たとえば、次のコマンドは、Server01およびServer02リモートコンピューターでDiskCollect.ps1スクリプトを実行します。

invoke-command -computername Server01, Server02 -filepath c:\Scripts\DiskCollect.ps1

永続的な接続を確立する

データを共有する一連の関連コマンドを実行するには、リモートコンピューターでセッションを作成してから、Invoke-Commandコマンドレットを使用して、作成したセッションでコマンドを実行します。リモートセッションを作成するには、New-PSSessionコマンドレットを使用します。

たとえば、次のコマンドは、Server01コンピューターにリモートセッションを作成し、Server02コンピューターに別のリモートセッションを作成します。 $ s変数にセッションオブジェクトを保存します。

$s = new-pssession -computername Server01, Server02

セッションが確立されたので、セッションで任意のコマンドを実行できます。また、セッションは永続的であるため、1つのコマンドでデータを収集し、それを後続のコマンドで使用できます。

たとえば、次のコマンドは、$ s変数のセッションでGet-Hotfixコマンドを実行し、結果を$ h変数に保存します。 $ h変数は$ sの各セッションで作成されますが、ローカルセッションには存在しません。

invoke-command -session $s {$h = get-hotfix}

これで、次のような後続のコマンドで$ h変数のデータを使用できます。結果はローカルコンピュータに表示されます。

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
14
Shanteva

Bitviseの tunnellier を試してください。それはsshクライアントです。 Windowsマシンに接続するための ssh server もあります。 2つを使用すると、Webプロキシやポートトンネリングなどのより高度な機能とともに、非常に安全な接続を確立できます。

4
cdmdotnet

Windows用のOpenSSHポートをインストールします。これは無料で、クライアントとサーバーの両方を提供します。

psexec を試すと、ファイル共有サービスを介してリモートシェルが提供されます(ただし、これは呼び出されます)。 Linuxをクライアントとして使用したい場合は winexe もあります。

2
Julian

PowerShellのアイデアは本当に気に入っていますが、サーバーとクライアントで構成に数分かかる場合があります。

PowerShellの使用を示唆しているShantevaの完全な回答とは別に、PowerShellサーバーへのリモート接続を実際に有効化(および許可)する方法については、howtogeek Webサイトの Here も参照してください。サーバーコンピュータで必要な設定が少しあります。

実行する必要がある2つの重要なこと:(すべての構成を「管理者として」行う必要があることについて言及する必要はありません。PowerShell/ cmdを「管理者として」開いてください)

  • まず、[〜#〜] server [〜#〜]でWINRMサービス(リモートコマンドを処理するWindowsアプリケーション)を有効にします。

サーバーコンピューターでPowerShellを開き、次のコマンドを実行します。

Enable-PSRemoting -Force

これを行う他の方法もあります。コマンドプロンプトを開いて実行できます。

winrm -quickconfig

変更する構成がさらに多くなる可能性があります。今は必要ありません。

  • 第二に、クライアントとサーバーが常にお互いを認証しようとしていることは注目に値します。サーバーは、クライアントがサーバーへのアクセスを実際に許可しているかどうかを確認する必要があります。このため、サーバーに認証情報を提供します(SSHと同様に、ユーザー名/パスワードを提供する場合があります)。逆に、クライアントはサーバーが信頼できるサーバーであることを確認する必要があります。スマートパブリック証明書を提供するサーバーを信頼するか、IPアドレスに基づいて信頼するか、またはおそらくすべてのユーザーを信頼するなど、さまざまなスキームを使用できます。ここでも、SSHで同じ手順を実行し、サーバーが認証情報を提供できるようにします。 (ここでは、SSHの詳細は忘れましょう。)

両方のコンピューターが同じ「ドメイン」(誰もが異なるルールと役割が割り当てられているコンピューターのグループ)にある場合、手順は単純なようです(私は試していません)。

ただし、おそらくインターネット(WANネットワークと呼ばれます)を介してサーバーにアクセスする必要があるため、いくつかの複雑な問題があり、リモートサーバーへの接続を許可するように構成を変更する必要があります。 [〜#〜]クライアント[〜#〜]コンピュータがWINRMサービスを有効にします。上記のサーバーに対して行ったのと似ていますが、次のコマンドを実行するだけです。

Enable-PSRemoting -Force

(ここでも注目に値します。クライアントコンピュータとサーバーコンピュータが「プライベート」ネットワーク上にある必要がある、またはすべてが機能しないとの言及があります。上記のコマンドを実行すると、このエラーメッセージが表示されますが、すべてが機能します。 。この事実はよくわかりません。前述のWebページを確認してください。)

次に、PowerShellの[〜#〜] client [〜#〜]コンピューターで実行します。

Set-Item wsman:\localhost\client\trustedhosts *

つまり、クライアントはすべてのサーバー(ホスト)を信頼します。最後に、これを([〜#〜] client [〜#〜]でもう一度実行します。強調):

Restart-Service WinRM

あなたは行く準備ができています。 Shantevaの残りの回答を確認してください。クライアントコンピュータで、たとえば次のコマンドを実行します。

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

パスワードが要求され、次のようなリモートコンソールが開きます。

[12.34.56.78]: PS C:\Users\Administrator\Documents>

次に、SSHの場合と同じようにコマンドを入力します。

1
Ali Nakisaee