sshを使えばリモートログイン以外にも、コマンド実行でいろいろなことができます。
例えばこんな環境でやってみます。
WindowsのTera Termを使って「ローカル」に普通にログインしてみます。
「リモート」にもログインしてみます。
今度は「ローカル」から「リモート」にログインしてみます。
この状態で例えば ls /home というコマンド実行すると「ローカル」から「リモート」側のhomeディレクトリのファイル・フォルダーの一覧を見ることができます。
「ログイン」という手続きを省略して、同じコマンドを実行してみます。
その前に、もう一つ手続きを省いてみます。
sshを実行する際にパスワードの入力を要求されますがこの手間を省きます。
sshpassを使います(公開鍵認証はまた別の機会に)。
「ローカル」側で以下を実行。
1 |
sudo apt install sshpass |
sshでコマンドを実行してみます(コマンド列はクオーテーションで括っても括らなくてもいいようです)。
初回(sshで一度もログインしたことがない端末の場合)は以下で実行
1 |
sshpass -p <パスワード> ssh -o "StrictHostKeyChecking no" tileserver@192.168.0.32 ls /home |
以降は以下でいいです。
1 |
sshpass -p <パスワード> ssh tileserver@192.168.0.32 ls /home |
これは「ローカル」側から「リモート」側のコマンドを実行して結果を取得できるということです。
例えば以下のようなシェルスクリプトを「リモート」側で作っておいて、「ローカル」から引数を渡して実行すれば、「リモート」側にファイルを作ってやることもできます。
1 2 3 4 5 6 7 |
【makefile.sh】 #!/bin/bash echo $1 > /home/tileserver/dat exit 0 |
シェルスクリプトはフルパスで指定します。
1 |
sshpass -p <パスワード> ssh tileserver@192.168.0.32 /home/tileserver/makefile.sh "Hello!" |
「リモート」側の/home/tileserverに”Hello!”と記述されたdatというファイルが作成されます。scpみたいなものですが手数は少ないです。
では、「リモート」側にシェルスクリプトが無い場合はどうしましょう。
その場合は、「ローカル」側にシェルスクリプトを作っておいて、「リモート」側のシェルに渡してやることで実行することができます。
こんな感じです。
1 |
sshpass -p <パスワード> ssh tileserver@192.168.0.32 'sh -s ' < /home/pi/makefile.sh "Hello\!World!" |
Bashを使いたければ…..
1 |
sshpass -p <パスワード> ssh tileserver@192.168.0.32 'bash -s ' < /home/pi/makefile.sh "Hello\!World!" |
シェルの標準入出力を使ったものです。
これで、「リモート」側の/home/tileserverに”Hello!World!”と記述されたdatというファイルが作成されます。
引数をダブルクオーテーションで囲って渡す場合、感嘆符(!)が末尾以外にある場合はエスケープする必要があります、ご注意ください。
また、以下のようなスクリプトの場合
「ローカル」側で「リモート」側のCPU温度を5秒間隔でモニターしてみます。
【mon_temp.sh】
bashは整数しか扱えないので面倒ですね。例えば48567という数値を1000で割った48.567という小数点数を表現する場合は工夫が必要です。
またcatをDATに渡しているところで使っているのはバッククォート(バックティック)です、間違えやすいのでご注意ください(Shift + @)。シングルクォートやダブルクオートで囲めば単なる文字列が変数に格納されますが、バッククォートを使うことで、シェルスクリプトの標準出力を変数に格納できます。(DAT=$(cat ……..)の方が推奨されてる?)
1 2 3 4 5 6 7 8 9 |
#!/bin/bash while true; do DAT=`cat /sys/class/thermal/thermal_zone0/temp` A=$((DAT/1000)) B=$((A*1000)) C=$((DAT-B)) echo $A.$C ° sleep 5; done |
実行権を付与しておきます
sudo chmod 777 mon_temp.sh
実行
1 |
sshpass -p <パスワード> ssh tileserver@192.168.0.32 'bash -s ' < mon_temp.sh |
以上
同じユーザー名、IPアドレスで構成した別の端末にSSHでログインしようとするとWARNINGが出て拒否されます。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
以前にsshを使った時に作成された公開キーを、以下のコマンドで削除しておく必要があります。
1 |
ssh-keygen -f "home/<ユーザー名>/.ssh/known_hosts" -R "相手先アドレス" |
SSHで接続して「リモート」側のGUIアプリを開いて実行してみる
Leave a Reply