Bash의 다른 사용자에게 함수를 전달 하시겠습니까? whoami exit } su vagrant -c ‘user_func’ 그러나

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

예를 들어 루트로 실행하는 작은 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 개 이상의 명령을 실행하려고 할 때 초과하지 않는 것이 좋습니다.

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



답변

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'

답변

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

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

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


답변

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


답변

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