파일에서 사용자와 비밀번호를 가져와 스크립트에서 사용해야 합니다.
내 파일은 다음과 같습니다(netrc는 내 파일 이름입니다).
machine ftp.test.net login test_user password test_pass
machine ftp1.test.net login test_user1 password test_pass1
파일에 액세스하고 특정 컴퓨터의 사용자 이름과 비밀번호를 가져오는 함수를 작성하고 싶습니다.
답변1
get_netrc_user () {
awk -v machine="$1" '$2 == machine { print $4 }' netrc
}
get_netrc_user () {
awk -v machine="$1" '$2 == machine { print $6 }' netrc
}
첫 번째 함수는 특정 컴퓨터에 대해 사용자 이름/로그인을 가져오고 두 번째 함수는 비밀번호를 가져옵니다.
지침:
username=$( get_netrc_user 'ftp.test.net' )
password=$( get_netrc_pass 'ftp.test.net' )
그러나 get_netrc_pass
비밀번호에 공백이 포함되어 있지 않다고 가정합니다. 그렇다면 조금 더 안전하도록 변경할 수 있습니다.
get_netrc_user () {
awk -v machine="$1" '$2 == machine { sub(".*password ", "", $0); print }' netrc
}
이제 파일에서 6번째 공백으로 구분된 필드를 반환하는 대신 문자열 앞의 모든 항목 password
(끝에 공백 포함)을 제거하고 줄의 나머지 부분을 반환합니다. 비밀번호에 분명히 해당 문자열이 포함되어 있으면 여전히 실패합니다.
답변2
나는 이렇게 할 것이다:
login=$(grep $mymachin "$myfile" | cut -d' ' -f3)
password=$(grep $mymachin "$myfile" | cut -d' ' -f5)
아니면 더 나은
# reading the file only once
login_password=$(grep $mymachin "$myfile" | cut -d' ' -f3,5)
login=$(cut -d' ' -f1 <<<$login_password)
password=$(cut -d' ' -f2 <<<$login_password)
이제 예제를 올바르게 읽었으므로 대안은 위치 대신 키워드를 사용하는 것입니다.
line=$(grep $mymachin "$myfile")
login=$(sed 's/.*login \(.*\) .*/\1/' <<<$line)
password=$(sed 's/.*password \(.*\) .*/\1/' <<<$line)
답변3
cat을 사용하여 파일을 출력하고, grep을 사용하여 시스템을 선택하고, awk를 사용하여 필드(귀하의 경우 비밀번호 등)를 필터링합니다.
그래서 이런 것
login=$(cat $myfile | grep $mymachine | awk '{print $4}')
답변4
다음 명령을 사용하여 사용자 이름과 비밀번호 가져오기를 완료하세요.
username=`awk '/Machinename/{print $4}' filename`
pass=`awk '/Machinename/{print $6}' filename`