/ bin / shリンクを一時的に変更する


9

私は/bin/shBashである必要のあるソフトウェアを持っていますが、UbuntuのデフォルトはDashであり、それをデフォルトのままにしておきたいです。永久にBashに変更したくありません。

実行中のターミナルセッションに対してのみ変更する方法はありますか?したがって、このターミナルで実行されているプログラムは/bin/shbashにリンクされているように見えますが、システムの残りの部分はまだDashを認識していますか?または、ソフトウェアをだまして/bin/shBashとして認識させることはできますか?

私はこのソフトウェアを作成せず、/bin/bash代わりに使用するためにそれをハッキングすること/bin/shは本当にオプションではありません。


2
一時的に変更できますが、(AFAIK)スコープを単一のターミナルセッションに制限することはできません。たとえば、/ bin / shは/ bin / bashを
指さ


7
何をするにせよ、問題のソフトウェアのバグとしてこれも報告してください。仮定があるため/bin/shであることbash 、バグ、そして(あなたが見つけるているとして)それは実際の問題を引き起こします。誰も文句を言わなければ、それは決して変更されないかもしれません。
marcelm

1
@SergiyKolodyazhnyyバグが、サポートするプラットフォームのみで問題を引き起こさない場合は、おそらくそれを回避できます。それでもまだバグです。
-marcelm

1
ソフトウェアは、ザイリンクスと呼ばれる「小さな」会社によってリリースされたPetalinuxであり、ドキュメントによればUbuntu 16.04が(CentOSおよびRHELとともに)サポートされているため、バグだと思います。
corwin 2018

回答:


10

2つの回答がすでにchrootとバインドマウントを提案しており、3番目の密接に関連するオプションがあります:マウントネームスペースプログラムを使用してunshare、新しいマウント名前空間を作成できます。この名前空間内のマウントは他の名前空間に影響しません。

たとえば、1つのターミナルで次のようにします。

muru|[0] ~ sudo unshare -m /bin/bash
root@muru-1604:~# sudo mount --bind /bin/bash /bin/sh
root@muru-1604:~# /bin/sh --version
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@muru-1604:~# sudo -iu muru
muru|[0] ~ /bin/sh --version  # propagates
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

そして別の:

$ /bin/sh --version
/bin/sh: 0: Illegal option --

したがって、この柔軟性のないプログラムを独自のマウント名前空間で実行できます。


14

スクリプトの場合は、次のようにスクリプトを呼び出します。

bash scriptname.sh

リンクを変更する必要はまったくありません。

コンパイルされた実行可能ファイルの場合、chrootルートに移動できます。

mkdir rootfs
cp -a /usr rootfs/
cp -a /lib rootfs/
cp -a /lib64 rootfs/
cp /bin/bash  rootfs/bin/sh
cp yourprogram  rootfs/
sudo chroot rootfs  sh

そして、あなたのプログラムを実行するか、 sudo chroot rootfs /yourprogram


ただし、実際には/bin/bash、へのシンボリックリンクとして使用できない理由はありません/bin/sh。実際、バージョン6.10より前は、 Ubuntuは/bin/bashas を使用/bin/sh/bin/shていまし/bin/shたが、POSIXのはるかに高速で無駄のない実装のために切り替えられました(つまり、UnixのようなオペレーティングシステムユーティリティとOSの動作に関するPOSIX標準に準拠しています。それらの内部の一部を実装する)、および移植性の理由による。どのようにして起こったのかについての歴史的なメモについては、Gillesの回答読むことを強くお勧めします/bin/dash。互換性に関しては、dashPOSIX機能を使用するために記述されたスクリプトbashは、デフォルトのシェルとして完全に問題なく実行されます。通常、問題を引き起こすのはその逆です-bashには/bin/sh<<<構文や配列など、には不要な機能があります。

さらに、問題のコマンドはおそらくRHELまたはCentOSを念頭に置いて記述されて/bin/bashおり、へのシンボリックリンクとして使用され、/bin/sh2つのことを示唆しています。それらはおそらく特定のOSをターゲットとし、POSIXの原則に準拠していません。その場合、コマンドが他に何を必要とするかを確認することもお勧めします。別のOSを念頭に置いて実際に記述されていると、単に再リンクするよりも多くの問題が発生する可能性があるため/bin/shです。


2
笑。人生はとてもシンプルなものになる可能性があります:-)
PerlDuck 2018

1
あなたは私の
賛成投票を

@JoshuaBesneatteありがとうございます!私の答えが役に立ったとうれしい
セルギー・コロディアズニー

3
+1し、コピーではなくハードリンクを作成することをお勧めします(lnまたはを介してcp -l)。
David Foerster、2018

1
mount --rbind --make-rslaveよりも考慮してくださいcp -r。読み取り専用にすることもできます。またsudo chroot、最適ではない可能性があるrootとしてスクリプトを実行します。
Roman Odaisky

5

1つの可能性は、単一ファイルのバインドマウントです。これを行うには、マウントのファイルを/bin/bashちょうど超える /bin/dashようにbash並べ替えカバーや皮革のdash。手順は次のとおりです(逆を含む)。

root@myhost:~# cd /bin

# situation before (bash and dash are different):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# mount /bin/bash over /bin/dash:
root@myhost:/bin# mount --bind /bin/bash /bin/dash

# situation now (bash and dash are the same):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# Now everything that runs `/bin/sh` in fact uses `/bin/bash`.

# check what the symlink "sh" says:
root@myhost:/bin# sh --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
...

# undo the mount:
root@myhost:/bin# umount /bin/dash 

# situation now (bash and dash are different again):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# check what the symlink "sh" now says:
root@myhost:/bin# sh --version
sh: 0: Illegal option --

ただし、シンボリックリンクmount --bind /bin/bash /bin/shを直接非表示にしようとはしませんでした。上記のmountトリックは、bashとdashを同一にするだけなので、をsh指してbashdashますが、また、これは現在のターミナルウィンドウだけでなく、システム全体のソリューションです。


私は告白しなければなりません、これはやり過ぎかもしれません、そして単にシンボリックリンクを一時的に変更することははるかに簡単です。別の方法を示したかっただけです。


1

エイリアスを使用して、現在のセッションだけに変更できるはずです。ターミナルでコマンドを実行する前に:

alias sh=bash

これは一時的なものであり、実行元のターミナルでのみアクティブになります。

ただし、スクリプトが絶対パスを使用している場合、これは機能しません。

そのように良い考えですが、ソフトウェアが明示的なパス名で/ bin / shを直接呼び出す場合、機能しません。とにかく、そのソフトウェアは、そのような仮定を行って非常に適切に設計されているようには見えません。使用する必要がある場合は、適切な環境を準備してリセットするスクリプトから実行することになるでしょう。–バナジウム

残念ながら、スクリプトの「ハッキング」が唯一の選択肢となる場合があります。@vanadiumとのコンボごとに、次のようなラッパースクリプトを作成できます。

#!/bin/bash
sudo ln -sf /bin/bash /bin/sh
/run/my/script
sudo ln -sf /bin/dash /bin/sh

ただし、スクリプトの実行中は、システム上で明示的にダッシュを必要としないものを望んでください。


3
そのように良い考えですが、ソフトウェアが明示的なパス名で/ bin / shを直接呼び出す場合、機能しません。とにかく、そのソフトウェアは、そのような仮定を行って非常に適切に設計されているようには見えません。使用する必要がある場合は、適切な環境を準備してリセットするスクリプトから実行することになるでしょう。
バナジウム

環境を整える方法を教えてください。あなたはchrootを使いますか?
Joshua Besneatte、2018

そんな野心的なアイデアはありませんでした。一時的にbashにshリンクし、完了時にリセットするスクリプトを考えていました。この質問の主な問題は、関係する「ソフトウェア」にあります。
バナジウム

シンボリックリンクが移動している間に他に何か必要なダッシュがあるとどうなりますか...冒頭のln -sf / bin / bash / bin / shや、完了したらln -sf / bin / dash / bin / shのようなものですか?
Joshua Besneatte、2018

他のほとんどのプロセスは、リンクが変更された場合、ダッシュではなくbashを喜んで使用します。はい、それでも無駄ですが、現在の状況を模倣するために、「cd / bin; ln -sf bash sh」などの相対リンクを作成しますが、これは実際には問題にならない純粋な詳細です。
バナジウム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.