Bash의 다른 사용자에게 함수를 전달 하시겠습니까?


11

한 사용자에서 다른 사용자에게 기능을 전달할 수있는 방법이 있습니까?

예를 들어 루트로 실행하는 작은 Bash 스크립트가 있습니다.

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

그러나 user_func 함수는 Vagrant 사용자에 대해 정의되지 않았으며 루트에 대해서만 정의되며 실행할 수 없습니다.

내 다른 옵션은 여러 줄을 갖는 것입니다.

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

또는 ex : su vagrant -c 'cmd1; cmd2; cmd3;', 여러 명령을 실행 하지만 특히 Vagrant 사용자로 5 개 이상의 명령을 실행하려고 할 때 초과하지 않는 것이 좋습니다.

동일한 스크립트 내에서 다른 사용자에게 함수를 전달할 수 있습니까 (예 : 디스크에 다른 사용자로 스크립트를 작성하지 않고 생성 된 스크립트를 실행하지 않음)? 아니면 내가 간과하는 또 다른 옵션이 있습니까?

답변:


10

export먼저 함수 정의에 필요한 것처럼 들립니다 .

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

트릭을해야합니다.

-fexport이 함수 이름이 아닌 변수의 이름입니다. 인용 help export:

이후에 실행되는 명령의 환경으로 자동 내보내기하도록 각 NAME을 표시합니다. ....

옵션 :

 -f   refer to shell functions

의견에서 peterph와 Stephane이 지적한 것처럼 이것은 두 가지를 가정합니다.

  1. 당신의 것을 su명령은 사용자의 환경을 덮어 쓰지 않습니다
  2. 그건 vagrant의 로그인 쉘이다 bash. 그렇지 않은 경우 suStephane에서 제공 하는 대체 명령 줄을 사용할 수 있습니다 .

    su vagrant -c 'bash -c user_func'

이것은 실제로 내가 바랐던 것입니다. 함수를 내보낼 수 있다는 것을 몰랐습니다. 이것은 샘플 스크립트를 편집 한 후 기대했던 것처럼 작동했습니다. 감사!
gdieckmann

1
좋지만 su환경을 재정의하는 경우에는 작동하지 않습니다 .
peterph

1
의 로그인 쉘이있는 경우에만 작동합니다 vagrant입니다 bash. 그렇지 않다면su vagrant -c 'bash -c user_func'
Stéphane Chazelas

6

약간 hackish이지만 sommand에 전달 된 함수의 정의를 인쇄 su한 다음 물론 사용할 수 있습니다.

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

이것은 어떤 이유로 든 스폰 된 쉘의 환경을 su덮어 쓰더라도 작동 합니다. 쉘 초기화 후에 정의를 넣기 때문입니다. 함수를 충분히 충분히 작성하면 문제의 두 사용자가 다른 쉘을 사용하는 경우에도 작동합니다.


+1 정말 깔끔한 트릭! 그러나 한 가지 질문은 su셸 환경을 외부 요인으로 덮어 쓸 수 있습니까? 이 경우 su스크립트에 있기 때문에 명령 줄을 완전히 제어 할 수 있습니다 . 새로운 쉘 환경을 어떻게 덮어 쓸 수 있습니까?
Joseph R.

예를 들어, 생성 된 쉘 su은 환경을 초기화 할 수 있습니다. 또한 su자체적으로 발신자의 환경 일부를 제거하여 보안을 약간 강화할 수 있습니다 (일반적으로와 같은보다 강력한 대안으로 수행되지만 sudo).
peterph

0

그것은 당신이 가진 스크립트가 아니라 함수입니다. 그래도 스크립트 를 원하는 것처럼 들립니다 . 필요에 따라 /usr/local/bin, 또는에 필요한 적절한 스크립트를 작성하여 작성하십시오. /home/vagrant/bin예 :su vagrant -c '/home/vagrant/bin/myscript.sh'


샘플 스크립트 내의 함수입니다. 이 단일 스크립트 (루트 및 Vagrant 사용자로 실행되는 명령) 내에서 수행하려는 모든 작업을 포함하고 Root 사용자를위한 별도의 스크립트와 Vagrant 사용자를위한 별도의 스크립트를 가질 필요는 없었습니다.
gdieckmann

0

이것을 수행하는 또 다른 좀 더 이식 가능한 방법 (bash 의존성 없음)은 스크립트가 자체를 호출하고 컨텍스트 (uid) 또는 매개 변수에 따라 동작이 변경되도록하는 것입니다. 이것의 예제는 super루트 권한이 필요한 스크립트를 보여주고 루트가 아닌 경우 super를 통해 자체를 호출하는 스크립트를 보여주는 문서에 제공됩니다 .

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