SSHサーバーにコマンドを渡すスクリプトを作成するにはどうすればよいですか?

SSHサーバーにコマンドを渡すスクリプトを作成するにはどうすればよいですか?

私にぴったりのいくつかのカスタムユーティリティを含むリモートSSHサーバーがあります。しかし、時には怠惰な感じがし、単一のコマンドを実行するために完全なSSHセッションを開始したくありません。

これにより、呼び出された名前を解決し、私のサーバーで一致するコマンドを実行し、私が提供した引数を渡すことができるシンボリックリンクを作成できるBusyBoxに似たマルチコールスクリプトを作成しました。

私はこれを初めて考えました。

#!/bin/bash

exec ssh -q -t my-server "$(basename "$0")" "${@@Q}"

しかし、これはPATH私の設定を正しく設定していないため、すべてのプログラムを使用することはできません。

次に、bashをログインシェルとして試しました。

exec ssh -q -t my-server bash -l "$(basename "$0")" "${@@Q}"

しかし、bashスクリプトではないものを実行するたびに、次のエラーが発生します。

/bin/ls: /bin/ls: cannot execute binary file

bashにコマンド文字列を渡そうとしています。

exec ssh -q -t my-server bash -l -c "$(basename "$0")" "${@@Q}"

これによりPATHが正しく設定され、バイナリが実行されますが、バイナリに渡されたすべての引数は失われます。

パラメータを次の文字列に渡してみました。

exec ssh -q -t my-server bash -l <<< "$(basename "$0") ${*@Q}"

ただし、インタラクティブプログラムはすぐに終了します。

私がしたいことが可能なことですか? SSHを介して非標準の任意のリモートコマンドを実行しPATH、正常にログインしたように動作させるにはどうすればよいですか?

ベストアンサー1

bashがコマンドを正しく実行するには、別のレベルのエスケープされた引用符を追加する必要があるようです。これまで、これは私が望む方法で正確に機能します。

#!/bin/bash

exec ssh -q -t eng-vm bash -l -c \""$(basename "$0") ${*@Q}"\"

おすすめ記事