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

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

場合によっては、リモート マシンでいくつかのコマンドを実行する必要があることがあります。これが時々行われる操作である場合は、リモート システムにログインしてコマンドを直接実行することで、この目的を達成できます。しかし、毎回これを行うのは面倒です。この場合、この面倒な操作をなくすためのより良い解決策はありますか?

はい、リモート システムにログインしなくても、ローカル システムからこれらの操作を実行できます。これには何か利点がありますか?間違いない。これにより、多くの時間を節約できます。

これはどのように達成されるのでしょうか? SSH を使用すると、ログインせずにリモート コンピューターでコマンドを実行できます。

一般的な構文は次のとおりです。

$ ssh [ユーザー名]@[リモートホスト名またはIP] [コマンドまたはスクリプト]

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

次の例では、ユーザーが ssh 経由でリモート Linux マシン上で df コマンドを実行できるようになります。

$ ssh [email protected] df -h
 ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
 /dev/mapper/centos-root 27G 4.4G 23G 17% /
 devtmpfs 903M 0 903M 0% /dev
 tmpfs 920M 0 920M 0% /dev/shm
 tmpfs 920M 9.3M 910M 2% /実行
 tmpfs 920M 0 920M 0% /sys/fs/cgroup
 /dev/sda1 1014M 179M 836M 18% /ブート
 tmpfs 184M 8.0K 184M 1% /run/user/42
 tmpfs 184M 0 184M 0% /run/user/1000

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

次の例では、ユーザーは ssh 経由でリモート Linux マシン上で複数のコマンドを同時に実行できます。

リモート Linux システムで uptime コマンドと free コマンドを同時に実行します。

$ ssh [email protected] "稼働時間 && 無料 -m"
 23:05:10 10 分経過、ユーザー 0 人、平均負荷: 0.00、0.03、0.03
       キャッシュされた未使用の共有バッファの合計
 会員数: 1878 432 1445 1 100 134
 -/+ バッファ/キャッシュ: 197 1680
 スワップ: 3071 0 3071

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

次の例では、ユーザーが ssh 経由でリモート Linux マシン上で sudo 権限を使用して fdisk コマンドを実行できるようにします。

通常のユーザーは、システムバイナリ (/usr/sbin/) ディレクトリで提供されるコマンドを実行することはできません。実行するにはユーザーが root 権限を持っている必要があります。

したがって、Linux システムで fdisk コマンドを実行するには、root 権限が必要です。 which コマンドは、指定されたコマンドの完全な実行可能パスを返します。

$ どのfdisk
 /usr/sbin/fdisk
$ ssh -t [email protected] "sudo fdisk -l"
 [sudo] daygeekのパスワード:
 ディスク /dev/sda: 32.2 GB、32212254720 バイト、62914560 セクタ
 単位 = 1 セクター * 512 = 512 バイト
 セクターサイズ(論理/物理):512バイト/512バイト
 I/O サイズ (最小/最適): 512 バイト / 512 バイト
 ディスクラベルタイプ: dos
 ディスク識別子: 0x000bf685
 デバイス ブート 開始 終了 ブロック ID システム
 /dev/sda1 * 2048 2099199 1048576 83 Linux
 /dev/sda2 2099200 62914559 30407680 8e Linux LVM
 ディスク /dev/sdb: 10.7 GB、10737418240 バイト、20971520 セクタ
 単位 = 1 セクター * 512 = 512 バイト
 セクターサイズ(論理/物理):512バイト/512バイト
 I/O サイズ (最小/最適): 512 バイト / 512 バイト
 ディスク /dev/mapper/centos-root: 29.0 GB、28982640640 バイト、56606720 セクタ
 単位 = 1 セクター * 512 = 512 バイト
 セクターサイズ(論理/物理):512バイト/512バイト
 I/O サイズ (最小/最適): 512 バイト / 512 バイト
 ディスク /dev/mapper/centos-swap: 2147 MB​​、2147483648 バイト、4194304 セクタ
 単位 = 1 セクター * 512 = 512 バイト
 セクターサイズ(論理/物理):512バイト/512バイト
 I/O サイズ (最小/最適): 512 バイト / 512 バイト
 centos7.2daygeek.com への接続が閉じられました。

4) SSH経由でリモートLinuxシステム上でsudo権限でサービス制御コマンドを実行する方法

次の例では、ユーザーが ssh 経由でリモート Linux マシン上で sudo 権限を使用してサービス制御コマンドを実行できるようにします。

$ ssh -t [email protected] "sudo systemctl httpd を再起動します"
 [sudo] daygeekのパスワード:
 centos7.2daygeek.com への接続が閉じられました。

5) 非標準ポート経由でSSH経由でリモートLinuxシステム上でコマンドを実行する方法

次の例では、ユーザーは ssh 経由で非標準ポートを使用してリモート Linux マシン上で hostnamectl コマンドを実行できます。

$ ssh -p 2200 [email protected] ホスト名ctl
  静的ホスト名: Ubuntu18.2daygeek.com
     アイコン名: computer-vm
      シャーシ: vm
     マシンID: 27f6c2febda84dc881f28fd145077187
      ブート ID: bbeccdf932be41ddb5deae9e5f15183d
   仮想化: Oracle
  オペレーティング システム: Ubuntu 18.04.2 LTS
       カーネル: Linux 4.15.0-60-generic
    アーキテクチャ: x86-64

6) リモートシステムの出力をローカルシステムに保存する方法

次の例では、ユーザーは ssh 経由でリモート Linux マシン上で top コマンドを実行し、出力をローカル システムに保存できます。

$ ssh [email protected] "top -bc | head -n 35" > /tmp/top-output.txt
cat /tmp/top-output.txt
 トップ - 01:13:11 18 分前に起動、ユーザー 1 人、平均負荷: 0.01、0.05、0.10
 タスク: 合計 168、実行中 1、スリープ中 167、停止中 0、ゾンビ 0
 %CPU: 0.0 us、6.2 sy、0.0 ni、93.8 id、0.0 wa、0.0 hi、0.0 si、0.0 st
 KiB メモリ: 合計 1882300、空き 1176324、使用中 342392、バフ/キャッシュ 363584
 KiB スワップ: 合計 2097148、空き 2097148、使用済み 0。使用可能なメモリ 1348140
 PID ユーザー PR NI 仮想リソース SHR S %CPU %MEM 時間+ コマンド
 4943 デイギーク 20 0 162052 2248 1612 R 10.0 0.1 0:00.07 トップ -bc
   1 ルート 20 0 128276 6936 4204 S 0.0 0.4 0:03.08 /usr/lib/sy+
   2 ルート 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
   3 ルート 20 0 0 0 0 S 0.0 0.0 0:00.25 [ksoftirqd/+
   4 ルート 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:+
   5 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:+
   7 ルート rt 0 0 0 0 S 0.0 0.0 0:00.00 [移行/+
   8 ルート 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcu_bh]
   9 ルート 20 0 0 0 0 S 0.0 0.0 0:00.77 [rcu_sched]
  10 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [lru-add-dr+
  11 ルート rt 0 0 0 0 S 0.0 0.0 0:00.01 [ウォッチドッグ/0]
  13 ルート 20 0 0 0 0 S 0.0 0.0 0:00.00 [kdevtmpfs]
  14 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns]
  15 ルート 20 0 0 0 0 S 0.0 0.0 0:00.00 [khungtaskd]
  16 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [書き戻し]
  17 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrity+
  18 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [バイオセット]
  19 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [バイオセット]
  20 ルート 0 -20 0 0 0 S 0.0 0.0 0:00.00 [バイオセット]

あるいは、次の形式を使用して、リモート システムで複数のコマンドを実行することもできます。

$ ssh [email protected] << EOF
ホスト名ctl
無料 -m
grep daygeek /etc/passwd
終了

上記のコマンドの出力は次のようになります。

stdin は端末ではないため、疑似端末は割り当てられません。
  静的ホスト名: CentOS7.2daygeek.com
     アイコン名: computer-vm
      シャーシ: vm
     マシンID: 002f47b82af248f5be1d67b67e03514c
      ブート ID: dca9a1ba06374d7d96678f9461752482
   仮想化: kvm
  オペレーティング システム: CentOS Linux 7 (コア)
    CPE OS 名: cpe:/o:centos:centos:7
       カーネル: Linux 3.10.0-957.el7.x86_64
    アーキテクチャ: x86-64
        使用可能な使用済み空き共有バフ/キャッシュの合計
 会員数: 1838 335 1146 11 355 1314
 スワップ: 2047 0 2047
 daygeek:x:1000:1000:2daygeek:/home/daygeek:/bin/bash

7) リモートシステムでローカル Bash スクリプトを実行する方法

次の例では、ユーザーが ssh 経由でリモート Linux マシン上でローカル bash スクリプト remote-test.sh を実行できるようにします。

シェルスクリプトを作成して実行します。

$ vi /tmp/リモートテスト.sh
#!/bin/bash
#名前: remote-test.sh
#--------------------
 稼働時間
 無料 -m
 df -h
 ユーネーム -a
 ホスト名ctl

上記のコマンドの出力は次のようになります。

$ ssh [email protected] 'bash -s' < /tmp/remote-test.sh
 01:17:09 22 分経過、ユーザー 1 人、平均負荷: 0.00、0.02、0.08
        使用可能な使用済み空き共有バフ/キャッシュの合計
 会員数: 1838 333 1148 11 355 1316
 スワップ: 2047 0 2047
 ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
 /dev/mapper/centos-root 27G 4.4G 23G 17% /
 devtmpfs 903M 0 903M 0% /dev
 tmpfs 920M 0 920M 0% /dev/shm
 tmpfs 920M 9.3M 910M 2% /実行
 tmpfs 920M 0 920M 0% /sys/fs/cgroup
 /dev/sda1 1014M 179M 836M 18% /ブート
 tmpfs 184M 12K 184M 1% /run/user/42
 tmpfs 184M 0 184M 0% /run/user/1000
 Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP 木 11月 8日 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  静的ホスト名: CentOS7.2daygeek.com
     アイコン名: computer-vm
      シャーシ: vm
     マシンID: 002f47b82af248f5be1d67b67e03514c
      ブート ID: dca9a1ba06374d7d96678f9461752482
   仮想化: kvm
  オペレーティング システム: CentOS Linux 7 (コア)
    CPE OS 名: cpe:/o:centos:centos:7
       カーネル: Linux 3.10.0-957.el7.x86_64
    アーキテクチャ: x86-64

代わりに、パイプを使用することもできます。出力がきれいでないと思われる場合は、よりエレガントになるように変更を加えます。

$ vi /tmp/リモートテスト1.sh
#!/bin/bash
#名前: remote-test.sh
 echo "---------システム稼働時間------------------------------------------"
 稼働時間
 エコー -e "\n"
 echo "---------メモリ使用量----------------------------------------------------------"
 無料 -m
 エコー -e "\n"
 echo "---------ディスク使用量----------------------------------------------"
 df -h
 エコー -e "\n"
 echo "---------カーネルバージョン--------------------------------------------------------"
 ユーネーム -a
 エコー -e "\n"
 echo "---------ホスト名情報------------------------------------------"
 ホスト名ctl
 エコー "------------------------------------------------------------------"

上記のスクリプトの出力は次のようになります。

$ cat /tmp/remote-test.sh | ssh [email protected]
 stdin は端末ではないため、疑似端末は割り当てられません。
 ---------システム稼働時間------------------------------------------
 03:14:09 2:19 起動、ユーザー 1 人、負荷平均: 0.00、0.01、0.05
 ---------メモリ使用量-------------------------------------------
        使用可能な使用済み空き共有バフ/キャッシュの合計
 会員数: 1838 376 1063 11 398 1253
 スワップ: 2047 0 2047
 ---------ディスク使用量-------------------------------------------------
 ファイルシステムサイズ 使用済み 使用可能使用率 マウント先
 /dev/mapper/centos-root 27G 4.4G 23G 17% /
 devtmpfs 903M 0 903M 0% /dev
 tmpfs 920M 0 920M 0% /dev/shm
 tmpfs 920M 9.3M 910M 2% /実行
 tmpfs 920M 0 920M 0% /sys/fs/cgroup
 /dev/sda1 1014M 179M 836M 18% /ブート
 tmpfs 184M 12K 184M 1% /run/user/42
 tmpfs 184M 0 184M 0% /run/user/1000
 tmpfs 184M 0 184M 0% /run/user/0
 ---------カーネルバージョン--------------------------------------------------------
 Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP 木 11月 8日 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 ---------ホスト名情報------------------------------------------
  静的ホスト名: CentOS7.2daygeek.com
     アイコン名: computer-vm
      シャーシ: vm
     マシンID: 002f47b82af248f5be1d67b67e03514c
      ブート ID: dca9a1ba06374d7d96678f9461752482
   仮想化: kvm
  オペレーティング システム: CentOS Linux 7 (コア)
    CPE OS 名: cpe:/o:centos:centos:7
       カーネル: Linux 3.10.0-957.el7.x86_64
    アーキテクチャ: x86-64

8) 複数のリモートシステムで複数のコマンドを同時に実行する方法

次の bash スクリプトを使用すると、ユーザーは複数のリモート システムで複数のコマンドを同時に実行できます。単純な for ループを使用して実装されています。

これを実現するには、PSSH コマンド、ClusterShell コマンド、または DSH コマンドを試すことができます。

$ vi /tmp/複数ホスト.sh
 CentOS7.2daygeek.com のホスト用 CentOS6.2daygeek.com
 する
  ssh daygeek@${host} "uname -a;uptime;date;w"
 終わり

上記のスクリプトの出力は次のようになります。

$ sh 複数ホスト.sh
 Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP 木 11月 8日 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 01:33:57 39 分経過、ユーザー 1 人、平均負荷: 0.07、0.06、0.06
 2019年9月25日水曜日 01:33:57 CDT
 01:33:57 39 分経過、ユーザー 1 人、平均負荷: 0.07、0.06、0.06
 ユーザー TTY 送信者 [email protected] アイドル JCPU PCPU 何
 daygeek pts/0 192.168.1.6 01:08 23:25 0.06秒 0.06秒 -bash
 Linux CentOS6.2daygeek.com 2.6.32-754.el6.x86_64 #1 SMP 火曜 6月19日 21:26:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 23:33:58 39 分経過、ユーザー 0 人、平均負荷: 0.00、0.00、0.00
 2019年9月24日火曜日 23:33:58 MST
 23:33:58 39 分経過、ユーザー 0 人、平均負荷: 0.00、0.00、0.00
 ユーザー TTY 送信者 [email protected] アイドル JCPU PCPU 何

9) sshpassコマンドを使用してパスワードを追加する方法

毎回パスワードを入力するのが面倒な場合は、ニーズに応じて次のいずれかの方法を選択してこの問題を解決することをお勧めします。

同様の操作を頻繁に行う場合は、標準的かつ永続的なソリューションとして、パスワードなしの認証を設定することをお勧めします。

これらのタスクを月に数回しか実行しない場合は、sshpass ツールを使用することをお勧めします。 -p オプションを使用してパスワードを入力するだけです。

$ sshpass -p 'ここにパスワードを入力してください' ssh -p 2200 [email protected] ip a
 1: lo: mtu 65536 qdisc noqueue 状態 UNKNOWN グループ デフォルト qlen 1
   リンク/ループバック 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 スコープ ホスト lo
    valid_lft 永久 preferred_lft 永久
   inet6 ::1/128 スコープホスト
    valid_lft 永久 preferred_lft 永久
 2: eth0: mtu 1500 qdisc pfifo_fast 状態 UP グループ デフォルト qlen 1000
   リンク/イーサ 08:00:27:18:90:7f brd ff:ff:ff:ff:ff:ff
   inet 192.168.1.12/24 brd 192.168.1.255 スコープ グローバル ダイナミック eth0
    有効_lft 86145秒 推奨_lft 86145秒
   inet6 fe80::a00:27ff:fe18:907f/64 スコープ リンク暫定 dadfailed
    valid_lft 永久 preferred_lft 永久

要約する

上記は、SSH を介してリモート Linux システムでコマンドを実行するために紹介した方法です。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • 初心者向け Linux コマンドの学習: ssh コマンド (リモート ログイン)
  • LinuxでSSHを使用してコマンドをリモート実行し、データベースをローカルにバッチエクスポートする
  • Linux での sshd サービスとサービス管理コマンドの詳細な説明
  • Linux でパスワードなしでバッチ SSH を実行するための Expect コマンド
  • Linux での ssh のインストールと scp コマンドの使用法の詳細な説明
  • PHPでLinuxコマンドを実行し、SSHサービスを開始する例
  • Linux VPS での一般的な SSH コマンドの概要

<<:  ロンボク実装 JSR-269

>>:  MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析

推薦する

Ubuntu での MySQL へのリモート ログインのインストールと設定に関するチュートリアル

この記事では、MySQLのインストールと設定のリモートログインチュートリアルを参考までに紹介します。...

Jsonフォーマットの詳細な説明

目次JSON は次の 2 つの構造に基づいて構築されます。 2. JSON形式1. オブジェクト2....

MySQL スロークエリ関連パラメータの原理の分析

MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...

IIS7 IIS8 リバースプロキシルールの記述、インストール、構成方法

目的: ステーションAをステーションBのセカンダリディレクトリとして扱うのように: http://w...

ボタンをクリックして画像を切り替える JavaScript

この記事の例では、ボタンをクリックすることで画像を切り替えることを実現するJavaScriptの具体...

MySQL の where と on の違いと、いつ使用するか

以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生...

JavaScript での実行コンテキストと実行スタックの例の説明

JavaScript - 原則シリーズ日常の開発では、既存のプロジェクトを引き継ぐときは常に、まず他...

簡潔なReactコンポーネントを書くためのヒント

目次スプレッド演算子を使用してプロパティを渡すのは避けてください関数パラメータをオブジェクトにカプセ...

vue+element テーブルで動的な列フィルタリングを実装するためのサンプルコード

要件: データをリスト形式で表示する場合、表示すべき情報項目が多く、表が横に長くなってしまいます。表...

Vue は PDF.js を統合して PDF プレビューを実装し、透かしを追加する手順を実行します。

目次成果を達成する利用可能なプラグインの紹介ニーズに応じてプラグインを選択するプラグインのインストー...

フレックスレイアウトが子要素によって引き伸ばされたときに、コンテンツをコンテナ内に保持する方法

モバイル デバイスでは、フレックス レイアウトが非常に便利です。デバイスの幅に応じてコンテナーの幅を...

startup.bat をダブルクリックすると Tomcat がクラッシュする問題の解決方法の詳細な説明

Tomcat を学習したばかりのプログラマーにとって、これはよくある間違いです。 1. 環境変数の問...

HTMLはキャンバスを使用して箇条書きスクリーン機能を実装します

導入最近、大きな課題をこなす際に、弾幕プレイヤーを作る必要がありました。他の人のソースコードを借りて...

シンプルなカウントダウン効果を実現するJavaScript

この記事の例では、カウントダウン効果を実現するためのJavaScriptの具体的なコードを参考までに...

カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る

カーソルカーソルは、結果セット内のデータを表示または処理するために使用される方法です。カーソルを使用...