반응형

출처 : https://stackoverflow.com/questions/6318809/how-do-i-grab-an-ini-value-within-a-shell-script

shell 스크립트에서 INI 파일 설정값을 얻는 방법은?

다음과 같은 parameters.ini 파일이 있습니다.

[parameters.ini]
    database_user    = user
    database_version = 20110611142248

bash 쉘 스크립트 내에서 parameters.ini 파일에 지정된 데이터베이스 버전을 읽고 사용하여 처리하려고 합니다.

#!/bin/sh
# 스크립트에서 사용하기 위해 parameters.ini 파일에서 데이터베이스 버전을 가져와야 함
PHP app/console doctrine:migrations:migrate $DATEBASE_VERSION

이를 어떻게 할 수 있을까요?


31개의 답변 중 1개

해당 라인의 값을 grep 하고난 뒤 awk를 사용하는 것은 어떨까요?

version=$(awk -F "=" '/database_version/ {print $2}' parameters.ini)
반응형
반응형

출처 : https://stackoverflow.com/questions/22683269/how-to-parse-a-config-file-conf-in-shell-script

shell 스크립트에서 설정 파일 (*.conf) 파싱하는 방법

저는 shell 스크립트 신입입니다. app.conf 파일이 다음처럼 있습니다.

[MySql]
user = root
password = root123
domain = localhost
database = db_name
port = 3306

[Logs]
level = logging.DEBUG

[Server]
port = 8080

저는 shell 스크립트에서 이 파일을 파싱하여 mysql 설정 정보를 추출하고 싶습니다. 어떻게 할 수 있을까요?

4개의 답변 중 1개의 답변만 추려냄

저는 다음처럼 하였습니다.

pw=$(awk '/^password/{print $3}' app.conf)
user=$(awk '/^user/{print $3}' app.conf)

echo $pw
root123

echo $user
root

$()는 변수 pw를 내부 명령의 출력으로 설정합니다. 안쪽의 명령은 app.conf 파일에서 password 로 시작하는 줄(line)에서 세 번째 필드를 출력합니다.

편집됨

설정 파일에서 많은 값을 파싱하려면 설정 파일 이름에 대한 변수를 만듭니다.

CONFIG=app.conf
pw=$(awk '/^password/{print $3}' "${CONFIG}")
user=$(awk '/^user/{print $3}' "${CONFIG}")

2개의 다른 포트가 있다면... 올바른 section이 나왔을 때 flag를 1로 설정하고 당신이 찾는 포트가 나왔을 때 종료(exit) 합니다.

mport=$(awk '/^\[MySQL\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")
sport=$(awk '/^\[Server\]/{f=1} f==1&&/^port/{print $3;exit}' "${CONFIG}")

역자 추가내용

저 같은 경우에는 다음처럼 파싱처리 하였습니다.

pw=$(awk -F "=" '/^\[MySQL\]/{f=1} f==1&&/^password/{print $2;exit}' "${CONFIG}")
반응형
반응형

출처 : https://stackoverflow.com/questions/25826752/using-tr-to-replace-newline-with-space/25826920

tr을 사용하여 줄바꿈을 공백으로 바꾸기

sed의 출력이 있습니다.

http://sitename.com/galleries/83450
72-profile

2개의 문자열은 다음처럼 하나로 합치고 각각은 공백으로 구분됩니다.

http://sitename.com/galleries/83450 72-profile

줄바꿈을 공백으로 바꾸기 위해 2개의 문자열을 파이프를 통해 tr로 넘겼습니다.

tr '\n' ' '

하지만 이는 작동하지 않고 결과는 입력과 같습니다.

ASCII 코드 '\032'로 공백을 표시하면 \n을 인쇄할 수 없는 문자로 바꿉니다.

무엇이 잘못되었습니까? 저는 Windows에서 Git Bash를 사용하고 있습니다.

1개의 답변

최고의 추측은 당신은 윈도우즈를 사용하고 당신의 줄 마지막 값 설정은 윈도우즈를 위한 값으로 설정되어 있습니다. 이 내용을 읽어보세요 : 줄 마지막 값 설정을 변경하는 방법

또는 다음을 사용하세요.

tr '\r\n' ' '
반응형
반응형

출처 : https://www.linuxquestions.org/questions/linux-newbie-8/ssh-login-without-password-not-working-4175561052/

비밀번호가 없는 SSH 로그인이 잘 안됩니다

안녕하세요.

여기에 첫번째 위협입니다만 제가 규칙을 어긴거라면 친절하게 대해주세요... :)

저는 NAS 장치가 있고 2개 장치 모두에 root로 접근합니다.

저는 그들 사이에 rsync를 하고 싶습니다.

rsync 명령은 잘 됩니다만... cron job으로 자동화가 불가능 하도록 만드는 password 구문이 프롬프트로 나타납니다.

저는 이미 rsa key를 생성했고 다른 NAS로 인증 키를 얻었지만, 그 이후에도 password 구문이 있습니다.

다음을 시도하였습니다.

"cat /root/.ssh/id_rsa.pub | ssh root@destinationip 'cat >> .ssh/authorized_keys'

다음처럼 결과가 나왔습니다.

"The authenticity of host 'dest ip (destip)' can't be established.
RSA key fingerprint is 35:60:b9:53:a4:08:fb:1a:be:7a:7d:b5:4f:ee:cc:2c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'destip' (RSA) to the list of known hosts.
root@destip's password:

누군가 범인이 어디에 있는지 힌트를 줄 수 있습니까?

1개의 답변

부적절한 권한이 주로 이에 대한 원인입니다.

chmod 750 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

대상 머신에서 위의 권한 작업을 해야합니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/229551/how-to-check-if-a-string-contains-a-substring-in-bash

Bash에서 문자열이 부분 문자열을 포함하는지 확인하는 방법

저는 Bash에서 하나의 문자열을 가지고 있습니다.

string="My string"

저는 이 문자열이 다른 문자열을 포함하는지 어떻게 테스트할 수 있을까요?

if [ $string ?? 'foo' ]; then
  echo "It's there!"
fi

어디에 제가 모르는 연산자 ??가 있나요? 저는 어떻게 echo와 grep을 사용할 수 있을까요?

if echo "$string" | grep 'foo'; then
  echo "It's there!"
fi

저는 이 부분에 약간 서투른 것 같습니다.

26개의 답변 중 1개의 답변만 추려냄

당신은 만약 이중 괄호를 사용한다면 case 구문 바깥에서 Marcus의 답변(* 와일드 카드) 를 사용할 수도 있습니다.

string='My long string'
if [[ $string == *"My long"* ]]; then
  echo "It's there!"
fi

needle string의 공백은 큰 따옴표로 묶어야 하며 * 와일드 카드는 큰 따옴표 바깥에 있어야 합니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/4936807/how-to-do-ssh-with-a-timeout-in-a-script

script에서 ssh로 timeout을 주는 방법?

저는 원격 호스트로 비밀번호 없는 SSH로 접속하는 script를 실행하고 있습니다. 만약 원격호스트가 실행하는데 무한의 시간이 걸린다면 저는 timeout을 설정하여 그 ssh 세션을 빠져나와 저의 sh script에서 다음 행을 진행하고 싶습니다.

timeout을 어떻게 설정할 수 있나요?


6개의 답변 중 1개의 답변

ssh -o ConnectTimeout=10  <hostName>

10은 초로 된 시간을 의미합니다. 이 timeout은 연셜 생성에만 적용됩니다.

반응형
반응형

출처 : https://serverfault.com/questions/84430/whats-wrong-with-my-cronjob-syntax-im-trying-to-use-a-backtick

cronjob 문법에서 backtick(`)을 사용하려는데 무엇이 잘못되었습니까?

제가 자동화 하고 싶은 것이 여기 있습니다.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +%Y-%m-%dZ%I:%M`"

하지만 다음처럼 오류 메세지가 나옵니다.

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

4개의 답변 중 1개의 답변만 추려냄

cronjob(5)에서

"여섯"번째 필드 (라인의 마지막)은 실행할 명령어입니다. 그 행의 전체 명령 부분 개행문자 혹은 %까지 /bin/sh에 의해 실행되거나 crontab 파일의 SHELL 변수에 정의된 shell에 의해 실행됩니다. 명령어에서 퍼센트 표시(%)가 backslash()에 의해 escape되지 않으면 이는 개행문자로 변경되고 첫번째 % 이후 모든 데이터는 표준 입력의 명령어로 보내집니다. 하나의 명령 행을 여러 행으로 나누지 않으려면 shell ""를 붙여야 합니다.

% 표시 앞에 backslash를 추가하면 됩니다.

00 08 * * * psql -Uuser database < query.sql | mail somone@null.com -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
반응형
반응형

출처 : https://www.shellscript.sh/tips/getopts/

Shell Script 튜토리얼 - 팁 Getopts

명령줄 인자 파싱하기

대부분의 Unix, Linux 명령은 "마이너스" 심볼을 앞에 붙여 옵션을 사용합니다. 예를 들어 파일 목록을 긴 포멧으로, (역순으로) 시간순으로 정렬할 때 당신은 ls -l -r -t를 사용하거나 ls -lrt를 사용할 수 있습니다.
몇가지 명령은 인자를 가지는데, 당신은 "myfiles" 디렉터리를 "mytarfile.tar"로 압축할 수 있습니다. tar -c의 경우, 압축 하기 위해 파일 목록을 취하는 옵션이 오게 됩니다.

The tl;dr lowdown

여기에 "너무 길어 읽지 않았다"처럼 빠른 개요가 있습니다. 다음처럼 getopts를 사용할 수 있습니다.

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

간단한 "-f" 형식 대신 "--filename"과 같은 긴 형식 인수를 구문 분석하는 외부 유틸리티 getopt도 있습니다. 당신도 그 게시물을 읽고 싶을 것입니다.

그렇습니다. 바쁜 사람들은 위 예시에 만족할 것이며 getopts가 무엇인지 어떻게 작동하는지와 당신의 스크립트에서 어떻게 유용하게 사용할 수 있는지 알아보겠습니다.

getopts 소개

당신을 위해 이 옵션들을 파싱하는 편리한 유틸리티를 getops라 부릅니다. 그 사용법은 조금 이상하게 느껴지지만, 이 기술은 당신의 스크립트가 옵션을 표준화되고 친근하게 느끼는 방법으로 처리하도록 합니다..

getopts를 통해 당신이 전달한 첫번째 인자는 그것이 받아들일 어떤 문자(혹은 숫자, 또는 다른 한개의 글자))의 목록입니다. 각 글자 뒤에 colon(:)는 tar -f mytarfile 처럼 인자가 따라온다는 의미입니다. tar -f는 tar 파일의 이름이 항상 따라와야 합니다. 이 옵션 인자는 $OPTARG 변수에서 당신의 스크립트로 보내집니다.

getopts$OPTIND 변수도 세팅하는데 나중에 다룰 것입니다.

당신이 getopts로 전달하는 두번째 인자는 현재 switch의 문자가 위치하게 될 변수의 이름입니다. 주로 이는 opt 또는 c로 불리며, 아무 이름으로 올 수 있습니다.

이 예시 스크립트는 tarball로 파일을 저장하고 복구할 수 있습니다. 당신은 그것에 -s(저장) 또는 -r(복구)로 그것에 전달해야 합니다. 만약 당신이 -d databasefile을 전달하면 데이터베이스를 덤프(또는 복구)하는 이름으로 사용될 것입니다. 만약 -f tarball을 전달하면 파일을 생성(또는 해제하는) tarball의 이름으로 사용될 것입니다.

이 첫 번째 스크립트 초안에서 다루지 않는 몇 가지 사항이 있습니다. -s-r을 모두 전달하는 것은 유효하지 않습니다. 그렇게 하면 이 스크립트는 마지막으로 전달한 것을 취하므로 dbdump.sh -s -r -d 또는 dbdump.bin -s -r -s는 마지막으로 처리 한 것이 저장 명령이므로 (복원하지 않고) 저장합니다.

마찬가지로 -d-f 중 하나 이상을 전달하지 않으면 아무 일도 일어나지 않습니다.

DB_DUMP TARBALL ACTION 설정이 안되는 이유는 스크립트가 이미 설정된 환경 변수의 영향을 받지 않기 때문입니다. 이는 실행중인 스크립트의 범위에만 영향을 미칩니다. 호출 쉘은 변수가 변경되지 않습니다.

간결하게하기 위해 여기서 save_database(), save_files(), restore_database()restore_files() 함수를 정의하지 않았습니다. 다운로드 가능한 스크립트에는 더미 기능이 있어 스크립트가 실제로 실행됩니다. 수행할 작업만 표시하지만 실제로는 파일에 아무런 작업을 수행하지 않습니다.

이 스크립트 다운로드(getops1.sh)

#!/bin/bash

unset DB_DUMP TARBALL ACTION

while getopts 'srd:f:' c
do
  case $c in
    s) ACTION=SAVE ;;
    r) ACTION=RESTORE ;;
    d) DB_DUMP=$OPTARG ;;
    f) TARBALL=$OPTARG ;;
  esac
done

if [ -n "$DB_DUMP" ]; then
  case $ACTION in
    SAVE)    save_database $DB_DUMP    ;;
    RESTORE) restore_database $DB_DUMP ;;
  esac
fi

if [ -n "$TARBALL" ]; then
  case $ACTION in
    SAVE)    save_files $TARBALL    ;;
    RESTORE) restore_files $TARBALL ;;
  esac
fi

getopts 명령은 while 루프에 대한 인수입니다. 루프를 통해 매번 switch를 처리하고 $c 변수를 switch의 문자로 설정합니다. 기본 튜토리얼에서 루프case에 대해 자세히 읽을 수 있습니다.

이 스크립트를 dbdump.sh -s -r -d /tmp/dbdump.bin -f /tmp/files.tar -s로 호출하면 -s를 처리하고 $c=s를 설정하고 처음으로 case`` 구문을 실행합니다.$c=s$ACTION=SAVE를 설정하고 그 줄의 끝에는 처리를 중지하라고 알려주고 while 루프 주위의 다음 실행을 위해 getopts로 돌아갑니다. 논리적으로 의미가 없는 -r을 읽지만 (백업을 저장하고 동시에 백업을 복원 할 수는 없지만) 스크립트는 이를 알지 못하므로$c=r을 설정합니다. case 문은$ACTION = RESTORE를 설정하고 다음 인수를 처리하기 위해getopts`로 돌아갑니다.

이제 getopts는 $c=d를 설정하고 $OPTARG = /tmp/dbdump.bin 도 설정합니다. getopts 호출에서 'd:는 -d 다음에 인수 (데이터베이스 덤프 파일의 이름)가 옵니다. 실행은 case 문으로 진행하여 $DBDUMP=/tmp/dbdump.bin을 설정합니다. 스크립트의 본문에 들어갈 때 $ DBDUMP 변수에 값이 있으면 데이터베이스를 해당 파일에 저장하거나 해당 파일에서 복원합니다.

다음 옵션은 -f /tmp/files.tar 이며 동일한 프로세스가 수행됩니다. getopts는 $c=f 를 설정하고 $OPTARG=/tmp/files.tar도 설정합니다. case 문은 이것을 읽고 $TARBALL=/tmp/files.tar를 설정합니다.

마지막으로 또 다른 -s 스위치를 전달하여 $ACTION 변수를 다시 SAVE로 변경합니다.

기본 스크립트가 시작되면 $DB_DUMP가 설정되어 있는지 확인한 다음 $ACTION 값을 확인하고 $ACTION 값에 따라 $DB_DUMP를 사용하여 데이터베이스를 저장하거나 복원합니다.

마찬가지로 $TARBALL이 설정되어 있는지 확인하고 $TARBALL을 인수로 사용하여 파일을 저장하거나 복원합니다.

반응형
반응형

출처

비밀 SSH 키로부터 공개 SSH 키를 생성하기

잃어버린 공개 키나 웹서비스는 SSH키를 생성하지만 당신에게 공개키를 제공하지는 않습니다. 이 때 지금할 것은 무엇일까요? 이 상황에 대한 해결책이 있습니다.

SSH key로부터 SSH 비밀번호 없이 로그인을 설정하기 위해 당신은 공개키가 필요합니다. 그러나 공개키를 잃어버려도 비밀키를 가지고 있다면 그 키를 재생성하는 방법이 있습니다.

잃어버린 공개키로, 다음 명령은 이 SSH 키로 공개키가 없다는 것을 보여줍니다.

$ ssh-keygen -l -f ~/.ssh/id_rsa
test is not a public key file.

-l 옵션은 공개키의 지문(fingerprint)을 알려주며 -f 옵션은 지문(fingerprint)을 나열하는 키의 파일을 지정합니다.

비밀키로부터 잃어버린 공개키를 다시 생성하기 위해 다음 명령어는 -f 옵션으로 제공된 비밀키에 대한 공개키를 생성할 것입니다.

$ ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
Enter passphrase:

-y 옵션은 비밀 SSH 키를 읽어 SSH 공개키를 stdout으로 출력할 것입니다. 공개키 부분은 비밀 키와 같은 이름의 파일이지만 확장자는 .pub 파일로 redirect됩니다. 키가 비밀번호 set이면 그 비밀번호는 공개키를 생성하는데 필요합니다.

생성된 공개키의 세부사항을 확인하려면 다음 명령어를 실행합니다.

$ ssh-keygen -l -f ~/.ssh/id_rsa
4096 d6:7b:c7:7a:4f:3c:4d:29:54:62:5f:2c:58:b2:cb:86 ~/.ssh/id_rsa (RSA)

이 명령어의 출력은 첫 번째 열에 키의 크기를 보여주며, 두 번째 열에는 지문(fingerprint)이 다음 열에는 파일명, type은 괄호로 둘러쌓여 보입니다. 위의 예제에서는 4096 비트의 RSA key입니다.

반응형
반응형

출처
https://stackoverflow.com/questions/4824590/propagate-all-arguments-in-a-bash-shell-script

bash 쉘 스크립트에서 모든 인수를 전달

저는 다른 스크립트를 호출하는 애무 간단한 스크립트를 작성하였고 현재 스크립트로부터 실행할 스크립트로 파라미터를 전달할 필요가 있습니다.
예를 들어 제 스크립트는 foo.sh이고 bar.sh를 호출합니다.
foo.sh:

bar $1 $2 $3 $4

각 파라미터를 명시적으로 지정하지 않고 이를 어떻게 할 수 있을까요?


8개의 답변 중 1개의 답변만 추려냄

같은 것을 파라미터로 사용하길 원하신다면 순수한 $@대신에 "$@"를 사용하세요.
확인:

$ cat foo.sh
#!/bin/bash
baz.sh $@

$ cat bar.sh
#!/bin/bash
baz.sh "$@"

$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4

$ ./foo.sh first second
Received: first
Received: second
Received:
Received:

$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:

$ ./bar.sh first second
Received: first
Received: second
Received:
Received:

$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:
반응형

+ Recent posts