ldapsearch 매개변수를 사용하여 zsh 함수 만들기

ldapsearch 매개변수를 사용하여 zsh 함수 만들기

실행할 때 아무런 문제 없이 명령줄에서 직접 실행할 수 있고 이를 $1LDAP에서 체크인하려는 실제 그룹 이름으로 바꿀 수 있는 몇 가지 명령이 있습니다. 이제 이를 매개변수화된 함수로 바꾸고 싶지만 아무것도 인쇄하기 위한 오류 메시지나 에코를 얻을 수 없습니다.

명령줄의 .zshrc에 다음 코드를 추가하여 zsh에서 호출할 수 있는 함수로 변환하려면 어떻게 해야 합니까? (공개용으로 약간 조정됨)

alias ldapuserlookup=" /usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b 'ou=Groups,o=.com' '(cn=$1)' memberuid | sed 's/memberuid: //g')"

예상 출력:

username1
username2
username3

이 질문은 백만 번은 받았을 텐데, 어떤 키워드를 검색에 넣어야 유용한 예가 될지 모르겠습니다. 그 중 많은 부분이 bash용이거나 내가 하고 있는 작업에 맞지 않습니다.

답변1

솔루션의 끝 부분까지 아래로 스크롤할 수 있지만 실제로 무슨 일이 일어나고 있는지 이해하는 것이 중요하므로 여기에 전체 분석이 있습니다.

답변에는 세 가지 수준이 있습니다.

1. 제공한 명령에 오류가 있습니다. )인수 끝에 추가 항목이 있어 sed다음과 같은 오류가 출력됩니다.

zsh: parse error near `)' 

$(...)(나는 이것이 구문을 사용하려고 시도하면서 남은 것일 수도 있다고 생각합니다)



2. 별칭을 사용하여 사용자 제공 매개변수에 대해 작동할 것으로 예상되는 명령을 실행하고 있습니다. 이 경우 대신 함수를 사용하고 싶습니다.

별칭은 본질적으로 명령 이름의 문자열 교체를 목적으로 하는 쉘 도우미이며 일반적으로 : alias ll='ls -al'등과 같은 추가 옵션 플래그를 사용합니다. alias grep='grep --color=auto'"또한 별칭에는 명령 동작을 쉽게 중단할 수 있는 여러 가지 주의 사항이 있지만 이는 이 질문에 구체적으로 대답할 수 있는 범위를 벗어납니다.

특정 경우에 사용하고 싶습니다.기능오히려 명령 인수를 받아들이고 필요에 따라 구문 분석하도록 설계되었기 때문입니다. 별칭과 유사하게 작동하므로 특정 터미널 내에서뿐만 아니라 전역적으로 동적으로 초기화될 수 있기 때문에 두 가지 측면 모두에서 최고입니다. 또한 실제 스크립트의 다양성을 가지면서도 스크립트 파일을 생성하는 번거로움이 없습니다.

별칭을 함수로 다시 포맷하려면 다음과 같이 선언합니다(참고: 이는 아직 완전한 솔루션이 아닙니다.):

ldap_userlookup(){
# It is standard practice to use '_' as separator function names 
 /usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b 'ou=Groups,o=.com' '(cn=$1)' memberuid | sed 's/memberuid: //g'
}

노트:명령 앞에 추가하는 것은 echo쉘이 특정 명령을 구문 분석하는 방법을 확인하는 좋은 방법입니다. 전체 디버그 출력에도 사용할 수 있지만 set -x이는 매우 장황할 수 있습니다.

다음 두 개의 접두사 선언을 사용하면 echo 제공된 인수 구문 분석의 차이점을 확인할 수 있습니다.

alias testalias='echo  "/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=$1) memberuid " '
test_func(){
   echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=$1) memberuid " }
  • 나쁜:선언된 별칭을 사용하고 실행하면 testalias argtest다음을 얻습니다.
 /usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=) memberuid  testarg

제공된 인수가 명령에 예상되는 대신 명령 끝에 추가되므로 이는 분명히 원하는 동작이 아닙니다( cn=$1)

  • 좋아요:이 함수를 사용하면 test_func argtest다음을 얻을 수 있습니다.
 /usr/bin/ldapsearch -LLL -x -h ldap.com -s sub -b ou=Groups,o=.com (cn=testarg) memberuid

**보시다시피, 우리가 선언한 함수는 명령줄 인수를 구문 분석 argtest한 다음 명령 내에서 원하는 올바른 위치에 배치할 수 있습니다. 즉, cn=**



삼.'가변 인수를 사용하고 있으며 bash둘 다 zsh다음 규칙을 따릅니다. 내부에 포함된 변수는 '확장되지 않지만 내부에 포함된 변수는 "확장됩니다.

함수 내부에 배치된 경우에도 명령(명확성을 위해 파이프를 다시 제거함)이 사용된 변수 래퍼를 기반으로 구문 분석되는 방법은 다음과 같습니다.

  • '함수 내에서 변수 주위에 작은따옴표 사용
test_func(){
    echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com'"  '(cn=$1)' memberuid 
 }

실행 중test_func argtest

잘못된 출력:

/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com' (cn=$1) memberuid

  • 큰 따옴표로 함수 형식을 다시 지정합니다 (덮어쓰게 된다는 것을 나타내기 위해 "이전의 불필요한 따옴표를 유지 ).'"
test_func(){
    echo "/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com'"  "'(cn=$1)'" memberuid
 }

실행 중test_func argtest

좋은 출력:

/usr/bin/ldapsearch -LLL -x -h ldap.com -s su -b 'ou=Groups,o=.com' '(cn=argtest)' memberuid


완벽한 솔루션:

전체 함수 선언( 파이프 echo제거, 추가, 큰따옴표 사용)은 원하는 동작을 제공해야 합니다.sed

ldap_userlookup () {
       /usr/bin/ldapsearch -LLL -x -h "ldap.com" -s "sub" -b "ou=Groups,o=.com" "(cn=$1)" memberuid | sed 's/memberuid://g'
}

테스트하고 작동하면 기본에 추가하여 ~/.zshrc모든 터미널 창에 로드하거나 이 함수와 기타 사용자 정의 함수를 정의하는 zsh별도의 파일을 생성할 수 있습니다 . 필요에 따라 껍질을 벗기십시오.~/.zsh_functionssource ~/.zsh_functions

관련 정보