リモートマシンでシェルスクリプト(windows / Linux)を実行する必要があります。
マシンAとBの両方でSSHを構成しています。スクリプトはマシンAにあり、リモートマシンであるマシンBでコードの一部を実行します。
ローカルコンピューターとリモートコンピューターは、WindowsまたはUnixベースのシステムのいずれかです。
plink / sshを使用してこれを実行する方法はありますか?
リモートマシンでシェルスクリプト(windows / Linux)を実行する必要があります。
マシンAとBの両方でSSHを構成しています。スクリプトはマシンAにあり、リモートマシンであるマシンBでコードの一部を実行します。
ローカルコンピューターとリモートコンピューターは、WindowsまたはUnixベースのシステムのいずれかです。
plink / sshを使用してこれを実行する方法はありますか?
回答:
マシンAがWindowsボックスの場合、-mパラメーターを指定してPlink(PuTTYの一部)を使用すると、リモートサーバーでローカルスクリプトが実行されます。
plink root@MachineB -m local_script.sh
マシンAがUnixベースのシステムである場合は、以下を使用できます。
ssh root@MachineB 'bash -s' < local_script.sh
スクリプトをリモートサーバーにコピーして実行する必要はありません。
sudo
、を実行しssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
ます。
HISTCONTROL=ignoreboth or ignorespace
させるために必要なPS )
ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
クレジットは以下の@chubbsondubsの回答に完全に移動します。
これは古い質問で、Jasonの答えはうまくいきますが、これを追加したいと思います。
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
これは、ユーザー入力を必要とするsuおよびコマンドでも使用できます。('
エスケープされたヒアドキュメントに注意してください)
編集:この答えはトラフィックのビットを取得し続けているので、私はこのヘレドキュメントの素晴らしい使用にさらに情報を追加します:
あなたはこの構文でコマンドをネストすることができます、そしてそれがネスティングが機能するように見える唯一の方法です(まともな方法で)
ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
実際にはtelnet、ftpなどの一部のサービスと会話できます。ただし、ヒアドキュメントはstdinをテキストとして送信するだけで、回線間の応答を待機しないことに注意してください
編集:私はあなたが使用する場合、タブで内部をインデントできることがわかりました<<-END
!
ssh user@host <<-'ENDSSH'
#commands to run on remote host
ssh user@host2 <<-'END2'
# Another bunch of commands on another host
wall <<-'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<-'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
(これはうまくいくと思います)
<<'ENDSSH'
)を単一引用符で囲むと、文字列は展開されず、変数は評価されません。<<ENDSSH
または<<"ENDSSH"
拡張したい場合にも使用できます。
Expect
FTPなどの対話型コマンドを自動化する必要がある場合に使用できます。
また、宛先ホストから変数を取得する場合は、変数をエスケープすることを忘れないでください。
これは私を過去に引っ張ってきました。
例えば:
user@host> ssh user2@host2 "echo \$HOME"
/ home / user2を出力します
ながら
user@host> ssh user2@host2 "echo $HOME"
/ home / userを出力します
もう一つの例:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
「hello」を正しく出力します。
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
実行しているループにそれを追加するためだけにssh
、ループ変数をエスケープしてはいけません。
ssh user2@host2 'echo hello world' | awk '{ print $1 }'
は、Awkスクリプトをローカルで実行することです。もちろん、リモートコマンドが膨大な量の出力を生成する場合は、それをすべてローカルサーバーにコピーして戻さないようにします。ちなみに、リモートコマンドを単一引用符で囲むと、エスケープする必要がなくなります。
これは、YarekTの回答を拡張したもので、インラインリモートコマンドとローカルマシンからリモートホストにENV変数を渡すことで、リモート側でスクリプトをパラメーター化できます。
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
これをすべて1つのスクリプトにまとめ、非常に読みやすく、保守しやすくすることで、これは非常に役立つと思いました。
なぜこれが機能するのか。sshは次の構文をサポートしています。
ssh user @ host remote_command
bashでは、次のように1行でコマンドを実行する前に、定義する環境変数を指定できます。
ENV_VAR_1 = 'value1' ENV_VAR_2 = 'value2' bash -c 'echo $ ENV_VAR_1 $ ENV_VAR_2'
これにより、コマンドを実行する前に変数を簡単に定義できます。この場合、echoは実行中のコマンドです。echoの前のすべてが環境変数を定義します。
したがって、これら2つの機能とYarekTの答えを組み合わせて、次のことを実現します。
ssh user @ host ARG1 = $ ARG1 ARG2 = $ ARG2 'bash -s' << 'ENDSSH' ...
この場合、ARG1とARG2をローカル値に設定しています。user @ host以降のすべてをremote_commandとして送信します。リモートマシンがコマンドARG1とARG2を実行すると、ローカルサーバーの環境変数を定義するローカルコマンドライン評価により、ローカル値が設定され、それらの変数を使用してbash -sコマンドが実行されます。出来上がり。
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
、stdinを介して供給されるスクリプトに引数を適用できることです。つまり、使用しない場合は省略してもかまいません。あなたはそれを使用する場合、使用環境変数に理由はありません:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
hostAユーザーの公開鍵をユーザー.sshのディレクトリのホームにあるauthorized_keysファイルにコピーしていない限り、パスワードの入力を求められます。これにより、パスワードなしの認証が可能になります(sshサーバーの構成で認証方法として受け入れられた場合)
より洗練された操作のためにファブリックを使い始めました。ファブリックにはPythonと他のいくつかの依存関係が必要ですが、クライアントマシン上でのみ必要です。サーバーはsshサーバーである必要があります。このツールは、SSHに渡されたシェルスクリプトよりもはるかに強力であり、セットアップする手間(特にPythonでのプログラミングを楽しむ場合)に値するものです。ファブリックは、複数のホスト(または特定の役割のホスト)で実行中のスクリプトを処理し、べき等演算(設定スクリプトに行を追加するなど、行がすでにある場合はそうではない)を促進し、より複雑なロジック(Pythonなど)の構築を可能にします言語が提供できる)。
実行してみてくださいssh user@remote sh ./script.unx
。
「リモート」マシンに手動でログインせずに、「ローカル」マシンからこれを自動的に実行したい場合、Expectと呼ばれるTCL拡張機能を調べる必要があります。このような状況のために設計されています。SSHを介してログイン/対話するためのスクリプトへのリンクも提供しました。
ここでの答え(https://stackoverflow.com/a/2732991/4752883)は、plink
またはを使用してリモートのLinuxマシンでスクリプトを実行しようとしている場合に最適ですssh
。スクリプトがに複数行ある場合に機能しますlinux
。
**ただし、ローカルlinux/windows
マシンにあるバッチスクリプトを実行しようとしていて
、リモートマシンがWindows
であり、それが**を使用する複数の行で構成されている場合
plink root@MachineB -m local_script.bat
動作しません。
スクリプトの最初の行のみが実行されます。これはおそらくの制限ですplink
。
複数行のバッチスクリプトを実行するには(特に、数行で構成される比較的単純な場合):
元のバッチスクリプトが次のとおりである場合
cd C:\Users\ipython_user\Desktop
python filename.py
local_script.bat
ファイルで次のように「&&」セパレータを使用して行を組み合わせることができ
ます:
https : //stackoverflow.com/a/8055390/4752883:
cd C:\Users\ipython_user\Desktop && python filename.py
この変更後、@ JasonR.Coombs:https : //stackoverflow.com/a/2732991/4752883によってここで指摘されているようにスクリプトを実行できます。
`plink root@MachineB -m local_script.bat`
バッチスクリプトが比較的複雑な場合は、ここで@Martin https://stackoverflow.com/a/32196999/4752883によって指摘されているように、plinkコマンドをカプセル化するバッチスクリプトを使用することをお勧めします。
rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N
rem Wait a second to let Plink establish the tunnel
timeout /t 1
rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R
rem Kill the tunnel
taskkill /im plink.exe
このbashスクリプトは、ターゲットのリモートマシンにsshを実行し、リモートマシンでコマンドを実行します。これを実行する前に(macでbrew install expect
)expectをインストールすることを忘れないでください。
#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"
runoversshを使用できます。
sudo apt install runoverssh
runoverssh -s localscript.sh user host1 host2 host3...
-s
ローカルスクリプトをリモートで実行する
便利なフラグ:
-g
すべてのホストにグローバルパスワードを使用します(単一パスワードプロンプト)
-n
sshpassの代わりにSSHを使用します。公開鍵認証に役立ちます
まず、scpを使用してスクリプトをマシンBにコピーします。
[user @ machineA] $ scp / path / to / script user @ machineB:/ home / user / path
次に、スクリプトを実行します
[user @ machineA] $ ssh user @ machineB "/ home / user / path / script"
これは、スクリプトに実行権限を与えている場合に機能します。