次の行を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 ...
myusername
sudo -i
答え1
インタラクティブにコマンドを入力することとコマンドを実行するスクリプトの違いについて私が考えるのは次のとおりです。
このwpa_supplicant
コマンドはSSHに必要なネットワークリンクを開きます。 sshコマンドが呼び出されたときにネットワークリンクが機能しない場合はどうなりますか?私の自宅のコンピュータでは、接続を開始するSYNパケットを受信する人がいないため、sshコマンドは長い間中断されます。その後、SSHがタイムアウトしてエラーを報告します。スクリプトと同じ症状です(Sshエラーを待つかどうか言及していませんが)。
wpa_supplicant
コマンドとコマンドを手動で入力すると、ssh
それらの間に5〜7秒があります。これは、sshコマンドが開始される前にネットワークリンクが確立されるのに十分な時間です。スクリプトがコマンドを実行すると、その間に時間がほとんどなく、sshが最初のSYNパケットを送信したときにリンクはまだ準備されていません。
sleep 10
私のアドバイスは、間の境界があなたに適していることを確認することです。echo
sudo ... ssh ...
答え2
元の答え
あなたの問題はクライアント側ではなくsshpass
サーバー側にあると思います。ssh
sudo
パスワードを設定する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
クライアントコンピュータのデスクトップに表示される小さなウィンドウにサーバーのパスワードを入力し、それを実行してアクティブな端末ウィンドウsudo
にfdisk
結果を表示します。
あなたの状況は異なる場合があります。まず、サーバーで適切な暗号化プログラムを確認/インストールする必要がありますsshpass
(不要な場合)。次に、サーバー側にssh-askpass
オプションを追加します。-A
sudo
コマンドラインを起動できると思います。
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.