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


19

* nixマシン用に設計されたフレームワークをWindowsに拡張するソリューションを考え出すのに苦労しています。フレームワークは現在、1つの* nixサーバーから実行され、sshは他の* nixサーバーに送信され、ログファイルのチェック、ソース管理からのファイルの同期、ソース管理へのログの送信など、さまざまなコマンドを実行します。立ち往生しているのは、リモートの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と他のカップルをチェックアウトしましたが、管理者アクセスが必要なようです。または、プレーンテキストでユーザー/パスを渡す必要があるようです。


設計上、非管理ユーザーは通常、リモートマシンでコードを実行できません。独自のソリューションを構築する必要がある場合があります。コードを実行する必要がある特定のコンテキストはありますか?コマンドは毎回同じように実行されますか?
ハリージョンストン

サーバーとしてMobaSSHをインストールし、クライアントとしてパテを使用したり、psexecを使用して多かれ少なかれやりたいことはできますが(私の経験では嫌われています)、Windowsの世界では同等のイディオムではシェルを使用しませんただし、コマンドレベルのリモート実行のサポートに依存するのは、それがレガシーコマンドであるか、ネットワーク共有およびマップされたドライブと組み合わされたPowerShellであるかです。
シャンテバ

回答:


14

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"} }

5
これはそれを行うネイティブの方法であり、受け入れられた答えである必要があります。
グレゴリーヒグレー

SSHはサーバーのポート22を使用して接続します。このPowerShellソリューションが使用するポートを確認してください。
ルーク

1
@ Lukeblogs.technet.microsoft.com / christwe / 2012 / 06 / 20/ 5985-5986がデフォルトですが、ほとんどの場合と同様に、別のポートを指定できます
-Shanteva

4

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


残念ながら、SSHサーバーはフリーウェアではありません。
ハリージョンストン

4

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


1
ただし、セキュリティ上の問題があります-Cygwinを使用しているため、マルチユーザーに対して安全ではありません。(私の情報が古くなっていなければ?)
ハリージョンストン

1
MicrosoftはWindowsへの適切な移植に取り組んでいます。しかし、非常に遅く進行のようだ:blogs.msdn.microsoft.com/powershell/2017/12/15/...
マーティン・ブラウン

2

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


1

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

脇のPowerShellの使用を示唆してShanteva、の完全な答えは、あなたも見て取る必要がありますここで、実際にPowerShellのサーバーへのリモート接続を有効にする(および許可)する方法についてhowtogeekウェブサイト上に。サーバーコンピューターには、わずかな構成が必要です。

実行する必要がある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 *

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

Restart-Service WinRM

あなたは行く準備ができています。シャンテバの答えの残りを確認してください。CLIENTコンピューターで、たとえば次を実行します。

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

パスワードの入力を求められ、次のようなリモートコンソールが開きます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.