SSH経由でsudoを必要とするコマンドを実行する方法

SSH経由でsudoを必要とするコマンドを実行する方法

Secure Shellには多くの機能が搭載されており、その多くは管理者の作業を飛躍的に楽にします。例えば、ログインせずにリモートサーバー上でコマンドを実行できる機能などです。

もちろん、サーバーにログインしてコマンドを実行し、ログアウトするまでに時間がかかることもありますが、すべてを一気に実行するのはどうでしょうか?これは便利なだけでなく、非常に簡単です。

参照: Linux 管理者が知っておくべきトップコマンド (TechRepublic Premium)

必要なもの

必要なのは、openssh-server が稼働している(そして接続を受け付ける)Linuxマシンが2台だけです。SSHデーモンがインストールされていない場合は、標準リポジトリからインストールできます。例えば、Ubuntu Serverプラットフォームでは、SSHデーモンをインストールするコマンドは以下のとおりです。

sudo apt-get install openssh-server -y

インストールが完了したら、次のコマンドでサーバーを有効にします。

sudo systemctl start sshd
sudo systemctl enable sshd

Ubuntuシステムでは、OpenSSHサーバーのサービスはsshdではなくsshという名前です。そのため、SSHサーバーを起動して有効化するコマンドは以下のようになります。

sudo systemctl start ssh
sudo systemctl enable ssh

リモートサーバー上でSSHデーモンが実行できるようになったので、コマンドを送信できるようになりました。やり方を見てみましょう。

参照: Linux、macOS、Windows で SSH キーを表示する方法 (TechRepublic)

基本コマンドの実行

リモートの/etcディレクトリにあるファイルのリストを取得してみましょう。これを行うには、次のコマンドを実行します。

ssh USER@SERVER_IP "ls /etc"

ここで、USER はリモートユーザー名、SERVER_IP はリモートサーバーの IP アドレスです。リモートユーザーのパスワードを正しく入力すると、リモートサーバーの /etc/ ディレクトリの一覧が表示されます。

簡単ですよ。

参照: Linuxでユーザーにsudo権限を素早く付与する方法 (TechRepublic)

sudoを必要とするコマンドを実行する

しかし、リモートサーバー上で sudo 権限を必要とするコマンドを実行する必要がある場合はどうでしょうか? そうすると、tty エラーが表示されます。

これはttyエラーです。画像: Jack Wallen

どうすればこれを回避できるでしょうか?幸いなことに、コマンドに追加できる小さなスイッチがあります。そのスイッチとは -t です。-t は何をするのか?これは擬似端末の割り当てを強制するため、ssh は使用できるローカル端末がないことを認識しません。

したがって、sudo 権限を必要とするリモート コマンドを ssh 経由で実行するには、ssh コマンドは次のようになります。

ssh -t USER@SERVER_IP "sudo COMMAND"

例えば、ユーザー jack に 192.168.1.201 にあるリモートサーバーをアップグレードさせたい場合、次のコマンドを実行します。

ssh -t [email protected] "sudo apt-get upgrade -y"

最初に SSH 接続用のユーザーのパスワードが求められ、次に sudo 権限用のユーザーのパスワードが求められます。

sudo権限を取得するためのユーザーのパスワード要求。画像: Jack Wallen

コマンドはローカルマシンで実行されたかのように実行されます(ただし、リモートマシンで実行されます)。コマンドが完了すると、ローカルプロンプトに戻り、作業を続行できるようになります。

SSH 経由でリモート マシン上で sudo 権限を必要とするコマンドを実行する方法はこれだけです。

この記事はもともと2019年7月に公開されました。2025年1月にAntony Peytonによって更新されました。

Tagged: