概要
多くの場合、リモートLinuxシステムで作業する必要があります。リモートホストにログインし、作業を実行して、そのセッションを終了します。これらすべてのアクションをローカルマシンから実行できますか?はい、可能です。このチュートリアルでは、徹底的な例を使用して説明します。
SSHを介したコマンドの実行
SSHを使用すると、リモートマシンにログインせずに、そのマシンでコマンドを実行できます。このチュートリアルでは、これを実現するためのさまざまな方法について説明します。
単一のコマンドを実行する
SSH経由でunameコマンドを実行してみましょう。
$ ssh [email protected] uname
上記のコマンドを見ると、通常のSSHコマンドと似ていますが、わずかな違いがあります。実行するコマンドを追加しました(赤色で強調表示)。
このコマンドを実行すると。以下の出力が生成されます:
Linux
複数のコマンドを実行する
この手法を使用すると、単一のSSHセッションを使用して複数のコマンドを実行できます。コマンドはセミコロン(;)で区切る必要があります。
$ ssh [email protected] "uname;hostname;date"
予想どおり、これらのコマンドは以下の出力を生成します:
Linux linux-server Thu Mar 1 15:47:59 IST 2018
昇格された権限でコマンドを実行する
昇格された権限でコマンドを実行する必要がある場合があります。その場合は、sudoで使用できます。
$ ssh -t [email protected] sudo touch /etc/banner.txt
「-t」を使用していることに注意してください 疑似端末の割り当てを可能にするSSHの‘オプション。 sudoコマンドには対話型端末が必要なため、このオプションが必要です。
スクリプトを実行する
リモート実行はコマンドだけに限定されません。 SSH経由でスクリプトを実行することもできます。 SSHコマンドへのローカルスクリプトの絶対パスを指定する必要があります。
次の内容の簡単なシェルスクリプトを作成し、system-info.sh
という名前を付けましょう。#!/bin/sh uname hostname
スクリプトを実行可能にして、次のようにリモートサーバーで実行します。
$ chmod +x system-info.sh $ ssh [email protected] ./system-info.sh
ご想像のとおり、以下の出力が生成されます:
Linux linux-server
変数拡張の問題
コマンドを複数行に分割すると、変数の展開は機能しません。簡単な例で見てみましょう:
$ msg="Hello LinuxTechi" $ ssh [email protected] 'echo $msg'
上記のコマンドを実行すると、変数が展開されていないことがわかります。
この問題を解決するには、 -cを使用する必要があります シェルのオプション。この例では、次のようにbashで使用します。
$ ssh [email protected] bash -c "'echo $msg'"
パスワードなしのSSHセッションを構成する
デフォルトでは、SSHは毎回パスワード認証を要求します。これは、セキュリティ上の理由から実施されます。ただし、煩わしい場合もあります。これを克服するために、公開鍵と秘密鍵の認証メカニズムを使用できます。
次の手順で構成できます。
1)公開鍵と秘密鍵のペアを生成する
SSHは、ローカルマシンでキーペアを生成するために使用できるssh-keygenユーティリティを提供します。
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/linuxtechi/.ssh/id_rsa): #press enter Enter passphrase (empty for no passphrase): #press enter Enter same passphrase again: #press enter Your identification has been saved in /home/linuxtechi/.ssh/id_rsa. Your public key has been saved in /home/linuxtechi/.ssh/id_rsa.pub.
上記の出力は、生成されたキーペアが〜/.sshディレクトリに保存されていることを示しています。
2)リモートホストの〜/ .ssh/authorized_keysファイルに公開鍵を追加します
これを行う簡単な方法は、ssh-copy-idコマンドを使用することです。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
上記のコマンドの場合:
- -iオプションはIDファイルを示します
- 〜/ .ssh/id_rsa.pubはIDファイルです
- 残りのテキストはリモートユーザーとリモートサーバーのIPです
注: 秘密鍵を他人と共有しないでください。
3)それだけです。とても簡単ではないですか?これで、パスワードを入力せずにSSH経由でコマンドを実行できます。これを確認しましょう。
$ ssh [email protected] uname
公開鍵と秘密鍵の認証の制限
公開鍵と秘密鍵の認証は私たちの生活を楽にするものだと考えられていましたが、完璧ではありません。その主な欠点は次のとおりです。初めてユーザーの操作が必要になるため、自動化することはできません。覚えて !!! ssh-copy-idコマンドにパスワードを提供しました。
パニックになる必要はありません、これは世界の終わりではありません。次のセクションでは、この制限を排除するアプローチについて説明します。
sshpassユーティリティ
上記の制限を克服するために、sshpassユーティリティを使用できます。 SSHセッションを認証するための非対話型の方法を提供します。このセクションでは、そのさまざまな方法について説明します。
sshpassのインストール
sshpassユーティリティはUbuntuの公式リポジトリの一部です。次のコマンドを使用してインストールできます:
$ sudo apt-get update $ sudo apt-get install sshpass
例
sshpassはパスワードを受け入れることができます–引数として、ファイルから、または環境変数を介してパスワードを読み取ります。これらすべてのアプローチについて説明しましょう。
1)引数としてのパスワード
–pオプションを使用して、引数としてパスワードを指定できます:
$ sshpass -p 'secrete-password' ssh [email protected] uname
2)ファイルからのパスワード
sshpassは、-fオプションを使用して通常のファイルからパスワードを読み取ることができます:
$ echo "secrete-password" > password-file $ sshpass -f password-file ssh [email protected] uname
3)環境変数からのパスワード
これに加えて、-eオプションを使用して環境変数からパスワードを提供できます:
$ export SSHPASS="secrete-password" $ sshpass -e ssh [email protected] uname
結論
このチュートリアルでは、SSHを介したリモートコマンド実行に関するさまざまなトリックとヒントを示します。これらのトリックを理解すると、生活がはるかに楽になり、生産性が確実に向上します。
また読む :Linuxでの9つの「diff」コマンド例