SSH接続がスクリプトを介して機能しない

SSH接続がスクリプトを介して機能しない

次の行を1つずつ実行すると、完璧に動作します。

sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sudo -i sshpass -p mypassphrase ssh [email protected] -T 'sudo mkdir /home/myusername/myFolder';

ただし、これをブロックとして実行するか、スクリプト内で実行すると、次のような結果が出力されます。

Successfully initialized wpa_supplicant
This echo still works.

最後の行は永遠に続きます。ディレクトリも作成されません。

どんな提案でも高く評価いたします。

編集#1

今まで答えてくれてありがとう。

@Sotto Voce:はい、wpa_supplicantはsshに必要な接続を開始します。

@sudodus:答えてくれてありがとう。この問題を再現するために、SSHコマンドラインでsudoを使用する必要はありません。元の投稿が混乱していたらすみません。とにかく単純化されたコード

sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassphrase ssh [email protected] 'who';

同じ効果を示します。ターミナルで1行ずつ貼り付けて実行するとうまくいきます。ただし、すべての行が同時に実行される場合(スクリプト内など)、常に最後の行が実行されます。

現在私が考えている方向は:ターミナルでのみ実行するときと、あらかじめ使用することは許可されないかもしれない組み合わせで実行するときに違うべきですか?sshpass -p mypassphrase ssh [email protected] 'who';sudo -i wpa_supplicant ...myusernamesudo -i

答え1

インタラクティブにコマンドを入力することとコマンドを実行するスクリプトの違いについて私が考えるのは次のとおりです。

このwpa_supplicantコマンドはSSHに必要なネットワークリンクを開きます。 sshコマンドが呼び出されたときにネットワークリンクが機能しない場合はどうなりますか?私の自宅のコンピュータでは、接続を開始するSYNパケットを受信する人がいないため、sshコマンドは長い間中断されます。その後、SSHがタイムアウトしてエラーを報告します。スクリプトと同じ症状です(Sshエラーを待つかどうか言及していませんが)。

wpa_supplicantコマンドとコマンドを手動で入力すると、sshそれらの間に5〜7秒があります。これは、sshコマンドが開始される前にネットワークリンクが確立されるのに十分な時間です。スクリプトがコマンドを実行すると、その間に時間がほとんどなく、sshが最初のSYNパケットを送信したときにリンクはまだ準備されていません。

sleep 10私のアドバイスは、間の境界があなたに適していることを確認することです。echosudo ... ssh ...

答え2

元の答え

あなたの問題はクライアント側ではなくsshpassサーバー側にあると思います。sshsudo

パスワードを設定する1つの方法は変数を設定することですSUDO_ASKPASS。私のメインコンピュータのファイルには~/.profile次の行があります。

export SUDO_ASKPASS=/usr/bin/ssh-askpass

私が確認できます

echo $SUDO_ASKPASS

それはそこにいて来ています。

which ssh-askpass

プログラムもあるべき場所にあります。この特定のプログラムにはGUIがあるので、ssh -Xゲストが使用できるようにします。sshpass -pサーバー側でもこれを使用できます(これらのタスクへのアクセス権が必要です)。

とにかくこれは私にとって効果的です。

ssh -tX [email protected] 'source /home/myuser/.profile; sudo -A fdisk -lu /dev/sda'

sudoクライアントコンピュータのデスクトップに表示される小さなウィンドウにサーバーのパスワードを入力し、それを実行してアクティブな端末ウィンドウsudofdisk結果を表示します。

あなたの状況は異なる場合があります。まず、サーバーで適切な暗号化プログラムを確認/インストールする必要がありますsshpass(不要な場合)。次に、サーバー側にssh-askpassオプションを追加します。-Asudo

コマンドラインを起動できると思います。

sshpass -p password ssh ...

セキュリティ上の理由から、私はそれをsudo実行するために使用しません。ssh明示的なパスワードも十分に悪いですが、時には高いレベルのセキュリティを維持することはあまりにも大きな問題です。

編集1:

最初のフィードバックを再テストした後、私のユーザーIDと一致するようにスクリプトを変更しましたが、うまくいきましたがうまくいきませんでしたが、オプション-t(小文字のt)を追加した後に機能しました。より良い点は、SSHセッションを管理する方法も示しています。その行は私とは関係がないのでコメントしましたwpa_supplicant(何をしているのかわかりませんが、問題が発生しないことを願っていますssh)。

私のスクリプトssher

#!/bin/bash

#sudo -i wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf;
echo "This echo still works.";
sshpass -p mypassword  ssh -t [email protected] 'who';

以下のないランタイム-t

$ ./ssher
This echo still works.
olle     tty7         2022-07-18 15:12 (:0)

-t上記のスクリプトに示すようにRunを使用してください。

$ ./ssher
This echo still works.
olle     tty7         2022-07-18 15:12 (:0)
sudodus  pts/1        2022-07-19 22:50 (192.168.0.12)
Connection to 192.168.0.2 closed.

関連情報