GNU/Linux >> Linux の 問題 >  >> Linux

SSH経由でリモートシステムでLinuxコマンドを実行する方法

概要

多くの場合、リモート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」コマンド例


Linux
  1. システムをクラッシュさせる方法:危険なLinuxコマンド

  2. リモートLinuxシステムで開いているポートを確認する方法

  3. Linux で strace および ltrace コマンドを使用する方法

  1. SSHFSを使用してSSH経由でリモートディレクトリをマウントする方法

  2. リモート マシンに ssh するためのシェル スクリプトを記述し、コマンドを実行する

  3. パスワードなしでsshコマンドをsudoコマンドをリモートで実行する方法

  1. Lynisセキュリティツールを使用してリモートLinuxシステムを監査する方法

  2. LinuxでのSSHコマンドと使用例

  3. Linuxスタートアップスクリプトとコマンドを自動実行する方法