デフォルトのシェルとしてbashを設定するにはどうすればよいですか?


10

Cyanogenmodを備えたデバイスにadbすると、素敵なbashシェル、カラープロンプト、bashrcが表示されます。/ system / xbin / bashから/ system / bin / shへのシンボリックリンクが表示されません。デフォルトのシェルをshではなくbashに設定するにはどうすればよいですか?rcファイルを調べましたが、何も見つかりませんでした。Androidビルドで同じことをしたいのですが、Cyanogenmodではありません。

更新

CM7を使用して最初から再インストールした後、bashではなくshに移行しました。ここで問題は、bashをデフォルトとして設定する方法です。


Vanilla CM7(ソースから作成)shbash、adbを使用して接続すると、ではなくにドロップします。どのビルドを使用していますか?
eldarerathis

ViewSonic Gタブレットでは7.1.0.1です。ソースからビルドしませんでした。
ラビ

回答:


7

ときにadb shell実行され、Androidの側も、次に実行ADBを起動します/system/bin/sh -。このパスは次の場所にハードコーディングされていsystem/core/adb/services.cます。

347 #if ADB_HOST
348 #define SHELL_COMMAND "/bin/sh"
349 #define ALTERNATE_SHELL_COMMAND ""
350 #else
351 #define SHELL_COMMAND "/system/bin/sh"
352 #define ALTERNATE_SHELL_COMMAND "/sbin/sh"
353 #endif

これをbashに変更する場合は、再コンパイルする必要があります。

対話型シェルの実行時に、ファイルからいくつかのコマンドを実行することが可能です。で書かれているようsystem/core/sh/main.csh --インタラクティブモードの場合はに注意)、次のファイルを(この順序で)読み取ります。

  • /etc/profile
  • .profile(これは、カレントディレクトリからの相対である/.profileためadb shell
  • $ENV(環境変数ENVはファイルを指す必要があります)

通り/etc//読み取り専用で、ロードされた何かを得るための唯一の方法は、設定によってでしたENV。おそらく、読み書きをマウントすることで、シンボリックリンクをから/etc/profileに作成できます(リーダーの演習)。/data/profile/


1
/ etcは/ systemパーティションへのシンボリックリンクです。私は、読み書きして、コメントを追加/ etc / profileを再マウントしますが、:( SHによって呼び出されません
コリン・

5

現在、テストするためのAndroidを持っていませんが、Android ターミナルエミュレーターを使用してメニューに移動すると、[コマンドライン]または[初期コマンド]オプションを使用できる場合があります。

ここに画像の説明を入力してください


ああ、私は私のadbプロンプトからそのメニューを試さなければならないでしょう。
mchid 2016

3

これは古い質問ですが、私は最近これに興味がありました。再コンパイルを必要としない方法を見つけましたadbdが、必要ですsu(Chainfire SuperSu 2.45を使用しています)。

仮定がbashにあり/system/bin/bash、かつsuである/system/xbin/suことは、本質的にこのようなものです:

  1. adb shell (インタラクティブシェルを使用してください。このプロセスをワンライナーとして呼び出すと、問題がある場合にADBが機能しなくなる可能性があります)
  2. mount -o remount,rw /system
  3. mv /system/bin/sh /system/bin/sh.bak
  4. echo -e '#!/system/bin/bash\n/system/xbin/su -mm -l -s /system/xbin/bash' > /system/bin/sh パスが異なる場合があることに注意してください。使用which bashwhich suて確認してください。
  5. chmod 777 /system/bin/sh
  6. 終了する前にシェルをテストします/system/bin/sh。エラーが発生した場合は、エラーを修正するか、バックアップを復元して元に戻しますcp /system/bin/sh.bak /system/bin/sh
  7. オプションで/ systemを再マウントします。ほとんどのデバイスはこれを自動的に行います: mount -o remount,ro /system

これで完了です。

この方法で呼び出された場合、bashはSHをエミュレートするため、BASHをSHにシンボリックリンクするだけでは機能しません。

ただし、straceを見るとbashrc、シンボリックリンクされたBASHが「sh --login」として呼び出されたときにa を探すように見えます。これはスクリプトを介してシェルを「チェーンロード」するために使用できると考えられますが、前述のようにadbdSHを呼び出す方法はハードコードされています。

問題があり、削除(または移動)した場合、/system/bin/shADBには問題を修正するためのシェルがありません。これが発生した場合、いくつかのオプションがあります。

  • adbd(CWMやTWRPなど)が含まれているリカバリで再起動し、adbシェルを開いて、/ system / bin / sh.bakを/ system / bin / shに再度コピーします。
  • adbを使用してバックアップをコピーし adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh ます。これはすべてのデバイスでは機能しないことに注意してください。この方法でadbが/ system rwを再マウントすることを拒否する人もいます。
  • 別のシェルを実行するように設定できるターミナルエミュレータを使用します。いくつかは最初に/ system / bin / shを試し、強制的に閉じることに注意してください。

0

PCでbashバイナリを取得して上書きします/system/bin/sh。私は1つ持ってここに

このコードを自由にコピーしてください:

git clone https://github.com/SuperDethByte/Bash-for-ARM.git        
cd Bash-for-ARM                
echo "Make sure your phone is plugged into your computer."          
sleep 5s                
echo "Remounting /system partition as r/w..."       
adb shell mount -o remount,rw /system          
echo "Making A Backup..."              
adb shell cp /system/bin/sh /system/bin/sh.bak         
echo "checking if backup was made..."          
if [ adb shell 'ls /system/bin/ | grep "sh.bak"' ]; then     
echo "pushing bash binary to android..."          
adb push bash /system/bin/sh       
echo "Remounting /system partition as r/o..."         
adb shell mount -o remount,ro /system          
echo "DONE"        
else         
echo "Backup Failed"           
echo "Remounting /system partition as r/o..."      
adb shell mount -o remount,ro /system     
fi   
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.