Chrome OS에서 Bash는 내 스크립트를 실행하지 않습니다. Bash에서 스크립트를 실행하려면 어떻게해야합니까?


16

나는이 foo.sh나의 현재의 디렉토리에 파일을. 실행하려고하면 다음 ./foo.sh과 같은 결과가 나타납니다.

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

그러나 내가 /bin/sh ./foo.sh달리면 잘 돌아갑니다.

이 문제를 어떻게 해결하여 바로 실행할 ./foo.sh수 있고 / bin / sh를 사용하여 자동으로 실행할 수 있습니까?

편집 : 좋아, 이것은 Chrome OS 이며이 특정 폴더는로 마운트됩니다 noexec. 분명히 그것은 단지 달리는 능력을 망쳐 놓는다 ./foo.sh. 그런데 왜? sh foo.sh똑같은 것을 달성하기 위해 여전히 달리는가? 그러면 어떤 보안이 noexec제공됩니까?


1
모호함을 통한 보안
Michael Durrant

". foo.sh"를 실행해도 효과가 있었습니까?
Daniele Testa

@DanieleTesta이 질문은 오래 전부터 고대 유물입니다. Chromebook의 초기 (그러나 안정적인) 버전을 실행하는 최초의 크롬 북 중 하나 인 Google Cr-48을 사용하고있었습니다. 그 이후로 우리는 먼 길을 왔습니다.이 질문이 최신 ChromeOS 버전에는 적용되지 않을 것이라고 생각하지만 확실하게 말하지 않았습니다. 어쨌든 귀하의 변형도 효과가 있다고 생각하지만 확실히 말하기 전에 테스트해야합니다. 나는 noexec그 마법이 어떻게 작동 하는지 여전히 확실하지 않습니다 .
Ricket

답변:


22

noexec즉, "예상"행동 할 것이기 때문에 플래그는 적절하게, 스크립트에 적용됩니다.

그러나 설정 noexec은 자신이하는 일에 대해 잘 모르는 사람들 만 막습니다. 실행 sh foo.sh하면 실제로로 마운트 된 파일 시스템에없는 sh기본 위치 (아마도 /bin) 에서 실행 됩니다 noexec.

당신은 주위를 얻을 수 있습니다 noexec호출하여 일반 바이너리 파일을 ld직접.

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

이것으로 마운트 된 파일 시스템에 있는지 여부에 관계없이 bash를 실행합니다 noexec.


5
ld.so(영리한) 언급에 +1
amphetamachine

나는 두 가지 명령을 시도했다; "공유 객체 파일을 열 수 없습니다 : 해당 파일이나 디렉토리가 없습니다"– sh는 복사되었지만 bash는 실행 중입니다. 그래서 시도 /lib/ld-2.10.1.so $HOME/sh하고 공유 라이브러리를로드하는 동안 다른 오류가 발생했습니다 /home/chronos/user/sh: failed to map segment from shared object: Operation not permitted. 당신이 말한 것이 사실이 아닌지, 아니면 다른 것이 방해가되는지 잘 모르겠습니다. 예를 들어, /는 읽기 전용으로 마운트됩니다.
Ricket

글쎄, 시도 할 ChromeOS 사본이 없기 때문에 확실하게 말할 수 없었습니다. 나는 그것이 약간의 수정으로 작동 할 수 있다고 확신하지만 직접 시도 할 수는 없지만 그것이 무엇인지 모릅니다.
bahamat

글쎄, Chrome OS가 제대로 잠겨 있기 때문이라고 생각합니다. 꽤 안전 해 보이지만 시간이 지남에 따라 볼 것입니다!
Ricket

1
ld와 사이에는 차이가 ld.so있습니다. ld은 컴파일 할 때 바이너리를 형성하기 위해 객체 코드를 연결하는 데 사용되는 링커 ld.so이며, 프로그램을 실행할 때 유사한 동작을 수행하는 런타임 링커입니다. 여기에 언급 된 링커는 런타임 링커입니다.
Kusalananda

5

MS-DOS 2 바이트 (캐리지 리턴 줄 바꿈) 줄 끝으로 파일을 실행하려고하면이 오류 (또는 매우 유사한 메시지)가 표시 될 수도 있습니다.

Vim은 요즘 너무 똑똑해서 캐리지 리턴을 '^ M'으로 표시하지 않아도됩니다. 따라서 Vim이 "파일 형식"이라고 생각하는 것을 확인하지 않고 화면 모양에만 의존하면 속일 수 있습니다.

이 경우 "#! / bin / sh ^ M"은 커널이 "/ bin / sh ^ M"을 찾지 못하도록합니다. 실제로 나쁜 통역사.


2

USB 스틱 (또는 기타 이동식 미디어)에서 스크립트 나 프로그램을 실행할 수있는 옵션이 있으면 마운트를 해제하고 수동으로 다시 마운트 해보십시오.

  1. USB 스틱 연결

  2. USB 스틱 장치 찾기 $ mount

  3. 참고하십시오. 그것이 있다고 가정하자/dev/sdb1

  4. USB 스틱 마운트 해제 :

    $ cd /media/removable
    
    $ sudo umount mountpoint

마지막으로 USB 스틱을 다시 마운트하십시오.

$ sudo mount /dev/sdb1 mountpoint

마운트 포인트를 사용하면 USB 스틱의 마운트 이름


1

ChromeOS / ChromiumOS의 시스템 보안상의 이유로 특정 폴더가 표시 noexec되어 있으므로 아래 명령으로 다시 마운트하거나 noexec두 번째 예제와 같이 설정 되지 않은 대체 경로를 사용해야합니다 .

이 명령은 최소한 개발자 모드에 있고 sudo 비밀번호를 알고있을 뿐 아니라 shellwith에 액세스 할 수 있다고 가정 합니다.chronos@localhost / $crosh>

sudo mount -i -o remount,exec /home/chronos/user/

Google은 /usr/local개발자 를 위해 대부분을 보유하고 있으므로 업그레이드 후에도 지속 가능한보다 지속 가능한 방법 :

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

여기에 물건을 넣어의 또 다른 이점은에 있다는 것입니다 $PATH이미 (시도 echo $PATH당신이에 스크립트 나 바이너리 실행하는 전체 경로를 사용할 필요가 없습니다 있도록이 확인) /usr/local/bin하고 있었다 chmod +x그들에 실행합니다.


2
안녕하세요, 유닉스 SE에 오신 것을 환영합니다! 여기서 단일 명령 답변은 HQ로 간주되지 않습니다. 나는 무엇을하고 있으며 왜 설명해야하는지 제안한다.
peterh-복원 모니카

0

나는 같은 질문을했다. 내 문제는 SD 카드에 관한 것이었다. 이것은 저에게 효과적이며 여기의 다른 답변보다 훨씬 간단합니다. Crouton issue # 928 에서 배웠습니다 .

$ sudo mount -o remount,exec /media/removable/SD\ Card

장치 (/ dev / mmcblk1p1)가 아닌 마운트 지점을 사용해야합니다. 귀하의 경우 USB (/ dev / sdb1)와 동일합니다. 마운트 지점 만 다릅니다.

$ sudo mount -o remount,exec /media/removable/USB\ Drive

쿼리 할 때 "noexec"가 마운트 옵션에서 사라 지므로 원하는 효과가 있음을 알 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.