/ 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
이 소프트웨어는 Xilinx라는 "소규모"회사에서 출시 한 Petalinux이며, 문서에 따르면 Ubuntu 16.04가 지원됩니다 (CentOS 및 RHEL과 함께).
corwin

답변:


10

두 가지 답변은 이미 chrooting 및 bind 마운트를 제안하며 밀접하게 관련된 세 번째 옵션 인 mount namespaces가 있습니다. 프로그램을 사용하면unshare 새로운 마운트 네임 스페이스를 만들 수 있으며이 네임 스페이스 내의 마운트는 다른 네임 스페이스에 영향을 미치지 않습니다.

예를 들어 한 터미널에서 다음을 수행합니다.

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/bash했으며 POSIX를 훨씬 빠르고 간결하게 구현 /bin/sh했기 때문에 전환 했습니다. 즉, Unix와 같은 운영 체제 유틸리티 및 OS의 작동 방식에 대한 POSIX 표준을 준수하고 휴대 성으로 인해 내부의 일부를 구현). 어떻게되었는지에 대한 역사적 메모에 대해 Gilles의 답변읽는 것이 좋습니다 . 호환성과 관련 하여 POSIX 기능 을 사용 하기 위해 작성된 스크립트 는 기본 쉘로 완벽하게 작동합니다. 일반적으로 문제를 일으키는 다른 방법입니다./bin/sh/bin/sh/bin/dashdashbashbash구문 이나 배열 /bin/sh처럼에 필요하지 않은 기능이 있습니다.<<<

또한 해당 명령은 RHEL 또는 CentOS를 염두에두고 작성된 것으로 아마도 /bin/bash심볼릭 링크로 사용 되는 /bin/sh두 가지 사항을 제안합니다. 특정 OS를 대상으로하고 POSIX 원칙을 준수하지 않았을 수 있습니다. 이 경우 다른 OS를 염두에두고 작성하면 다시 연결하는 것보다 더 많은 문제가 발생할 수 있으므로 명령에 필요한 다른 사항을 확인하는 것이 좋습니다 /bin/sh.


2
LOL. 인생은 너무 간단합니다 :-)
PerlDuck

1
당신은 나의
공로를

@JoshuaBesneatte 감사합니다! 내 대답이 유용하다는 것을 알게되어 기쁘다
Sergiy Kolodyazhnyy

3
+1 하드 링크 대신 사본 (를 통해 만들 더 좋을 수도 ln또는 cp -l).
David Foerster

1
mount --rbind --make-rslave오히려 고려하십시오 cp -r. 읽기 전용으로도 만들 수 있습니다. 또한 sudo chroot최적이 아닌 루트로 스크립트를 실행합니다.
Roman Odaisky

5

단일 파일 의 바인드 마운트 가 가능합니다. 이렇게하려면, 당신은 마운트 파일을 /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가리 키지 bash만 참조 합니다 dash. 또한 이것은 현재 터미널 창뿐만 아니라 시스템 전체 솔루션입니다.


자백해야합니다. 이것은 과잉 일 수 있으며 symlink를 일시적으로 변경하는 것이 훨씬 쉽습니다. 방금 다른 가능한 방법을 보여주고 싶었습니다.


1

별명을 사용하여 현재 세션에 대해서만 변경할 수 있어야합니다. 터미널에서 명령을 실행하기 전에 :

alias sh=bash

이것은 일시적이며 실행 된 터미널에서만 활성화됩니다.

그러나 스크립트가 절대 경로를 사용하면 작동하지 않습니다.

좋은 생각이지만 소프트웨어가 명시적인 경로 이름으로 / bin / sh를 직접 호출하면 작동하지 않습니다. 어쨌든, 그 소프트웨어는 그러한 가정을하도록 매우 적절하게 디자인되지 않은 것 같습니다. 아마도 환경을 전혀 사용하지 않으면 적절한 환경을 준비하고 재설정하는 스크립트에서 실행할 것입니다. – 바나듐

불행히도, "해킹"스크립트가 유일한 옵션 일 수 있습니다. @vanadium을 사용하여 convo별로 다음과 같은 래퍼 스크립트를 만들 수 있습니다.

#!/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

그런 야심 찬 아이디어는 없었습니다. 방금 bash에 연결하고 완료되면 재설정 할 스크립트를 생각하고있었습니다. 이 질문의 주된 문제는 "소프트웨어의 조각"과 관련이 있다고 생각합니다.
바나듐

심볼릭 링크가 이동하는 동안 다른 대시가 필요한 경우 어떻게됩니까? ... 시작에서 ln -sf / bin / bash / bin / sh 및 완료되면 ln -sf / bin / dash / bin / sh와 같은 것?
Joshua Besneatte

대부분의 다른 프로세스는 링크가 변경되면 대시 대신 bash를 사용합니다. 네, 헛된 상황이지만 현재 상황을 모방하기 위해 "cd / bin; ln -sf bash sh"와 같은 상대적인 링크를 만들지 만 실제로는 중요하지 않은 순수한 세부 사항 일 것입니다.
바나듐
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.