Linux 명령 행 (CLI) 우수 사례와 팁을 축적 할 토론을 열고 싶습니다.
아래 설명을 공유하기 위해 그러한 토론을 검색했지만 찾지 못했습니다.이 게시물.
우리 모두가 이것으로부터 배울 수 있기를 바랍니다.
Bash 팁, grep, sed, AWK, / proc 및 기타 모든 관련 Linux / Unix 시스템 관리, 쉘 프로그래밍 모범 사례를 모두 공유 할 수 있습니다.
Linux 명령 행 (CLI) 우수 사례와 팁을 축적 할 토론을 열고 싶습니다.
아래 설명을 공유하기 위해 그러한 토론을 검색했지만 찾지 못했습니다.이 게시물.
우리 모두가 이것으로부터 배울 수 있기를 바랍니다.
Bash 팁, grep, sed, AWK, / proc 및 기타 모든 관련 Linux / Unix 시스템 관리, 쉘 프로그래밍 모범 사례를 모두 공유 할 수 있습니다.
답변:
사용 화면 , 하나에 여러 개의 터미널을 가질 수 GNU 프로젝트에 의해 개발 된 무료 터미널 멀티플렉서.
세션을 시작하면 연결이 끊긴 경우에도 터미널이 저장되므로 나중에 또는 집에서 다시 시작할 수 있습니다.
SSH!
SSH는 신의 명령입니다. 배우는 것이 가장 귀중한 명령이라고 생각합니다. 옵션은 꽤 어려울 수 있지만 SSH에 새로운 명령 줄 옵션을 사용하여 끊임없이 필요하다고 생각하는 것을 끊임없이 배우는 것처럼 보입니다. 나는이 시점에서 그것들을 모두 사용했을 것이다.
많이 사용할수록 더 많이 배울 수 있습니다. 그것을 사용하여 놀라운 일을 할 수 있습니다.
참고 : ssh 서버를 실행하는 것 외에는 서버에 설정이 없어도 이러한 모든 작업이 원격으로 수행 가능합니다.
인터넷을 통해 파일 시스템 마운트
SSHFS에 대한 인터넷 검색
앞으로 명령 .
SVN + SSH 프로토콜은 원격 클라이언트에서 실행중인 데몬이없는 서버로의 Subversion입니다! SVN 명령은 ssh 쉘을 통해 서버를 시작하고 기존 파이프를 통해 정보를 앞뒤로 전달합니다. rsync 프로그램은 SSH를 통해 자체적으로 시작하여 rsync 데몬이없는 서버에 대해 동일한 작업을 수행합니다. 비슷한 트릭을 수행하기 위해 자신의 bash 파일을 쉽게 작성할 수 있습니다.
방화벽을 통과하는 체인
나는 이것을 사용하여 리눅스 서버를 집에서 맥으로 옮긴다.
포워드 포트 :
홈 방화벽을 통해 반송하고 홈 네트워크 내에서 마치 마치 집에서 라우터를 구성 할 수 있다는 것을 알 때까지는 적당히 유용한 것 같습니다.
전달 X 요청 :
이것은 또 다른 놀라운 것입니다. 원격 시스템에서 X 서버를 실행하거나 사용하지 않고 x-windows 프로그램을 실행할 수 있으며 창이 로컬 화면에 나타납니다. 스위치 -X 만 사용하면됩니다.
원격 서버에서 X 서버를 실행할 필요가 없으므로 서버에 대한 CPU 영향이 최소화되므로 Windows 및 cygwin / X를 실행하는 강력한 게임 PC에 거대한 앱을 제공하는 TINY Linux 서버를 가질 수 있습니다.
물론 VI와 EMACS는 SSH를 통해 작동하지만 집에서 실행할 때 때로는 더 많은 것을 원합니다. ssh -X를 사용하여 Eclipse 사본을 시작합니다! 서버가 랩톱보다 강력하면 랩톱에 GUI가 있지만 컴파일은 서버에서 수행되므로 시스템로드에 대해 걱정하지 마십시오.
배치 파일로 실행
(다른 시스템에서 "작업을 수행하는"로컬 배치 파일을 실행한다는 의미) :
두 가지가 결합되어 하나를 시원하게 만듭니다. 하나는 (보다 안전한) 암호화 키를 사용하여 비밀번호 프롬프트를 제거 할 수 있다는 것입니다. 두 번째는 SSH CLI에서 명령을 지정할 수 있다는 것입니다. 원격 서버에서 컴파일이 실패 할 때처럼 SSH를 컴퓨터에 넣고 사운드 파일을 재생할 수 있습니다.)
원격 명령의 출력을 리디렉션하여 로컬 배치 파일 내에서 사용할 수 있으므로 서버에서 실행중인 컴파일을 로컬에서 수행 할 수도 있습니다.
Mac에 내장
서버와 클라이언트는 모두 맥과 리눅스에 내장되어 있습니다. Mac 및 Ubuntu의 경우 서버를 활성화하는 것은 올바른 확인란을 찾는 것만 큼 간단합니다.
cygwin 또는 cygwin / X 설치 PC (cygwin / X를 사용하면 x- 윈도우 출력을 Linux 시스템에서 Windows PC로 전달할 수 있음-X 서버를 설치 함)
중요 팁 / 구성 파일
방화벽에서 포트 22를 사용하지 마십시오. 많은 해킹 시도를 할 수 있지만 가치가 없습니다. 방화벽이 다른 포트를 서버로 전달하도록하십시오.
ssh 명령을 크게 단순화 할 수있는 광범위한 구성 옵션이 있습니다. 직장에서 내 예는 다음과 같습니다.
Host home
hostname billshome.hopto.org
Port=12345
user=bill
LocalForward=localhost:1025 mac:22
"ssh home"(아무것도 입력하지 않음)을 입력하면 마치 입력 한 것처럼 작동합니다.
ssh -p 12345 bill@billshome.hopto.org
그리고 로컬 포트 1025를 집의 시스템 "mac"으로 전달합니다. 그 이유는 파일에 다른 항목이 있기 때문입니다.
Host mac
hostname localhost
port=1025
"ssh home"을 수행 한 후에도 여전히 창을 연 상태에서 "ssh mac"을 입력하면 여기에있는 컴퓨터가 실제로 "mac : 22 "는 다른 명령으로 시작되므로 방화벽을 통해 집에있는 Mac에 연결됩니다.
편집-멋진 스크립트!
나는 내가 좋아하는 오래된 스크립트를 파헤 쳤다. 다시 관심을 가질만한 누군가를 위해 그것을 다시 게시해야했다. 스크립트는 "authMe"라고합니다
#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
echo 'id_dsa.pub does not exist, creating'
ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub
홈 디렉토리에이 스크립트가 있고 ssh를 통해 연결할 수있는 호스트가있는 경우 "./authMe hostName"을 입력 할 수 있습니다.
필요한 경우 공개 / 개인 키 쌍을 생성하고 다른 컴퓨터로 ssh하고 공개 키를 복사합니다 (ssh 명령은 암호를 묻습니다 ...)
이 후 SSH 명령은 해당 원격 시스템에 연결할 때 더 이상 비밀번호를 요구하지 않아야하며 공개 / 개인 키 쌍을 사용합니다.
원격 컴퓨터가 항상 안전한 것은 아니라는 메시지가 표시되면 "암호 구문"설정을 고려해야합니다.
추가 보안을 위해 텍스트 비밀번호 (키만)를 허용하지 않도록 파 엔드에서 ssh 서버를 구성 할 수도 있습니다.
ssh-copy-id
하며 다음과 같이 간단합니다ssh-copy-id user@someserver
나는 사용하고 싶다
cd -
이전 디렉토리로 전환합니다. 매우 유용한!
최근에 pv
고양이와 비슷하지만 전송 세부 정보가 있는 명령 (파이프 뷰어)을 발견했습니다 .
그래서 대신
$ gzip -c access.log > access.log.gz
당신이 사용할 수있는
$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
따라서 작업이 언제 끝날지 모르는 대신 이제 알 수 있습니다!
tee(1)
.
sudo !!
이전 명령을 루트로 다시 실행하십시오.
[ 이 질문의 행을 따라 테마가 지정된 사이트 인 http://www.commandlinefu.com 사이트의 현재 최상위 명령 ]
Ctrl-R을 누르고 명령 (또는 그 일부)을 입력하기 시작하면 명령 내역이 검색됩니다. Ctrl-R을 다시 누르면 다음 일치 항목으로 건너 뛰고 Enter는 현재 표시된 명령을 실행하며 오른쪽 화살표 (적어도)를 사용하여 먼저 편집 할 수 있습니다.
$ (reverse-i-search)`svn': svn status
나는 이것을 배우기 전에 주 OS로 7 년 동안 Linux를 사용했지만 지금은 그것을 알기 때문에 매우 편리합니다.
stty -ixon
먼저 XON / XOFF 흐름 제어 의미를 해제 해야 할 수도 있습니다 (이는 또한 Ctrl-Q를 사용 가능하게합니다. 기본적으로 Ctrl-V 인용 삽입과 동일하게 맵핑되지만 다른 것으로 변경할 수 있습니다) ). 참조 man stty
및 man readline
더 많은 정보를위한. stty
명령은 추가 할 수 있습니다~/.bashrc
커맨드 라인은 재밌습니다. 커맨드 라인을 사용하여 다른 사람을 우연히 보면서 우연히 많은 것을 배울 수 있다고 생각합니다.
나는 수년 동안 손으로 디렉토리 이름을 힘들게 입력하면서 쉘을 사용하고 있었다. 어느 날 나는 친구가 시스템에서 엉망인 것을보고 있었고 그는 계속 키를 쳤다. "왜 탭을 치나요?"라고 물었습니다. 답 : 디렉토리 나 파일 이름을 완성하려고합니다. 누가 탭을 완성했을까요? 약간의 파일이나 디렉토리를 입력하고 탭을 누르면 입력 한 내용을 마무리하려고 시도합니다 (동작은 셸에 따라 다름).
어느 날 친구가 명령 줄에서 나를보고 있었고 다음과 같은 유형을 보았습니다.
coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $
누가 추측 했을까!? 그는 popd
/ 에 대해 전혀 몰랐다 pushd
. 우리도 ...
로그 아웃 한 후에도 프로그램을 실행 상태로 두는 것이 유용한 경우가 있습니다. 그 목적으로 nohup 또는 화면을 사용하는 솔루션을 보았습니다. 내가 아는 가장 간단한 것은 :
$ your_command_here & disown
실행중인 프로그램을 분리 할 수도 있습니다.
$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
별칭이 아닌 실제 명령을 사용하려면 백 슬래시를 사용합니다.
\rm -rf ~/tmp
builtin
" 도 참조하십시오 .
이 팁을 통해 CLI를보다 편안하게 만들 수 있습니다 (적어도 나를 위해).
다음 내용으로 ~ / .inputrc 파일을 만듭니다.
"\e[A": history-search-backward
"\e[B": history-search-forward
bash를 다시로드하십시오 (예 : "exec bash"를 입력하여). 명령의 접두사를 입력하고 위쪽 화살표를 누르면 접두사로 시작하는 명령을 찾아 볼 수 있습니다. 예를 들어 ssh를 입력하면 원격 쉘과의 이전 연결이 표시됩니다. 프롬프트가 비어 있으면 위쪽 화살표가 일반적인 방식으로 기록을 탐색합니다.
exec bash
man readline
기본 단축키 를 읽고 암기하는 것도 교육적입니다.
bind -f ~/.inputrc
새로운 bash를 시작하지 않고 inputrc를 다시로드하고 현재 환경을 정리할 수도 있습니다.
한 번에 여러 명령을 실행할 때 &&
대신 사용하십시오 ;
. 오류가 발생하면 중지되고 다른 명령을 실행하지 않습니다.
고전적인 예 :
./configure && make && make install
dosomething && echo "success" || echo "teh fail"
bash의 명령 줄에 루프를 작성할 때 종종 위험한 명령 앞에 'echo'명령을 붙입니다.
for item in items; do echo something-risky; done
이 방법으로 나는 그것을 실행하기 전에 '위험한 것'을 완전히 보게됩니다. 위험한 명령에 변수 확장 및 글롭이 포함 된 경우 도움이됩니다. 'set -x'는 bash 스크립트를 작성할 때 매우 유용합니다.
'set -x'는 디버깅을 가능하게합니다. bash 디버깅에 대한 정보는 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html 을 참조하십시오 .
두 서버 사이의 최대 대역폭을 테스트해야합니다.
에 SERVER1 수행
nc -u -l 54321 > /dev/null
에 SERVER2 수행
dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done
다음과 같은 출력이 표시됩니다.
182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out
여기서 실제 네트워크 전송 대역폭을 보여주는 117MB / s 가 흥미로운 요소입니다.
설명 :
패킷이 네트워크를 통해 흐르기 시작하면 SERVER2에서 대역폭 통계를 볼 수 있습니다. 이는 두 서버 간의 실제 최대 가능한 대역폭에 대한 추정치입니다.
UDP로 복사 (TCP 오버 헤드 방지).
로 복사 로부터 SERVER1에 메모리 (/ 디바이스 / 제로) 에 SERVER2에 메모리 (/ 디바이스 / NULL), 따라서, 병목 디스크 I / O를 방지한다.
컬러 디렉토리 구조를 보는 것이 더 쉽습니다.
alias ls="ls --color=tty"
편집하다
alias ls="ls --color=auto"
로그보기에 관한 몇 가지 작은 포인터 :
tail -f
당신은 한 번에 여러 로그를 볼 수 있습니다! 예 :tail -f log1.txt -f log2.txt
파일 확장명을 쉽게 변경하기 위해 오랫동안 친구 로부터 트릭을 배웠습니다 .
mv my_filename.{old,new}
쉘 확장은 이것을 다음으로 확장합니다 :
mv my_filename.old my_filename.new
다음과 같은 다른 방법으로 파일 이름을 바꾸는 데 사용할 수도 있습니다.
mv my_{,cool_}filename
ls -l /bin/c
한 다음 Alt-Shift- {를 누르면 원하는대로 완성됩니다 ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}
.
압축 된 아카이브를 추출하려면 "tar xf"를 사용하십시오. tar는 아카이브의 파일 유형을 감지하므로 bzip2의 경우 j 및 gzip의 경우 z는 필요하지 않습니다. 인수 앞에 '-'부호도 없습니다. 많은 시간을 절약 할 수 있습니다 (밀레니엄 ;-)).
unfoo 를 사용 하면 불필요한 인수없이 단일 명령으로 아카이브를 추출 할 수 있습니다.
alias ut="tar xf"
. 아카이브 추출이 훨씬 쉬워졌습니다.
나는 끊임없이 이것들을 사용한다
ALT-. (일부 터미널에서는 ESC +.) 마지막으로 사용한 인수를 복사합니다 (매우 유용한).
CTRL-W는 단어를 삭제합니다
CTRL-L 클리어 터미널 (클리어 명령과 같지만 더 빠름)
ALT-B (일부 터미널에서는 Esc + B)는 단어를 뒤로 이동합니다
ALT-F (일부 터미널의 경우 ES + F)는 단어를 앞으로 이동시킵니다.
CTRL-E가 EOL로 이동
CTRL-A가 BOL로 점프
역사에서 CTRL-R 검색
bash에서는 ! $ 를 많이 사용합니다. 마지막 명령의 마지막 인수를 반복합니다.
ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$
ls를 실행 한 다음 편집하려면 다시 입력 할 필요가 없으며! $를 사용하십시오. 긴 경로 / 파일 이름에 정말 유용합니다. 또한 ! * 는 이전 명령의 모든 인수를 반복합니다. 나는 그것을 많이 사용하지 않지만 유용하게 보입니다.
나는 그들이 언급되었다는 것을 알고 있지만 vim, screen 및 cd를 많이 사용합니다.
나는 noclobber를 잊었다.
set -o noclobber
에서 남자 bash는 :
설정된 경우 bash는>,> & 및 <> 리디렉션 연산자로 기존 파일을 덮어 쓰지 않습니다. 경로 재 지정 연산자> |를 사용하여 출력 파일을 작성할 때 이는 대체 될 수 있습니다. > 대신.
Alt-.
있습니다.
bash에서 zsh로 전환하고 생산성이 향상되는 것을 확인하십시오.
Google은 더 많은 혜택을 알려 드릴 것입니다.
구식 학교, 디렉토리 트리를 한 곳에서 다른 곳으로 옮기고 심볼릭 링크, 권한 및 모든 좋은 것들을 보존합니다.
tar cBf - . | (cd /destination; tar xvBpf -)
또는 네트워크를 통해
tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)
새로운 학교:
rsync -urltv . /destination
또는 네트워크를 통해
rsync -urltv -e ssh . foo.com:/destination
tar xvBpf - -C /destination
== (cd /destination; tar xvBpf -)
타이핑이 적고 ssh보다 사용하기 쉽습니다.
rsync -avh
단일 컴퓨터에서 사용하는 것이 가장 좋습니다. h
각 링크를 별도의 파일로 변환하지 않고도 하드 링크가 올바르게 전송되도록합니다. 파일 수가 많으면 많은 메모리를 사용할 수 있습니다. rsync -avzh . foo.com/destination
는 네트워크와 동일하며 일반적 -e ssh
으로 rsync가 ssh를 사용하기 때문에 알 필요가 없습니다 .
rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
요구 사항 : 삭제할 큰 파일 목록을 포함하는 디렉토리가 있습니다. rm -r이 실패합니다!
예
find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long
해결책 :
find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +
설명 :
편집 : @ephemient 주석 다음에 설명 수정.
find는 최대 허용 인수로 rm에 인수를 제공합니다. 이렇게하면 rm이 파일을 일괄 적으로 삭제할 수 있습니다. 이것은 find 자체의 -delete 작업을 사용하지 않고 내가 알고있는 가장 빠른 기술입니다. 그것은 동등하다
find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f
find
지원하지 않는 경우 유용 할 수 있습니다 -exec ... +
.
\;
with +
: find
는 xargs
기본적으로 수행하는 작업 을 수행하며, 인수 목록 제한을 초과하지 않고 가능한 한 많은 인수를 일괄 처리합니다. 또는 (두 가지 모두에 필요한 GNU Findutils)의 -delete
intead를 사용 하십시오-exec rm
find ... -delete
당신의 발견이 너무 부여 되었다면.
나는이 두 가지 팁을 너무 자주 사용하여 공유하는 것이 좋을 것이라고 생각했습니다.
!foo
히스토리 파일에서 "foo"로 시작하는 마지막 명령을 시작합니다 ( !gcc
예를 들어 컴파일 할 때 자주 사용합니다 ).
다른 하나는 키보드 단축키 (Return 대신 Ctrl + O)이며 명령을 실행하고 내역 파일에 다음 명령을 표시합니다. 예를 들어 파일을 컴파일하고 테스트 할 때 항상 3 ~ 4 개의 명령을 수행하고 테스트의 디렉토리에 cd를 만들고 테스트를 실행하여 makefile의 디렉토리에 cd하십시오. Ctrl + O를 사용하면이 작업이 훨씬 쉬워집니다. :)
이 도움을 바랍니다!
사용할 수없는 멋진 그래픽 인터페이스를 사용하지 않고 Linux에서 서브 버전을 사용하는 방법.
svn co <repo-url> . # Checks out project into current folder
svn update # Get latest changes from server
svn status # Shows what files have changed locally
svn add <path/filename> # Add some file to the repo
svn commit # Commit your changes to the repo
이로 인해 많은 개발자들이 이상하게도 Linux를 사용하지 못하게됩니다.
가장 간과 된 구식 사령부 : find
어제 총 권한 버그를 수정했습니다.
for u in nr dias simonpj; do
sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
chmod 644 $(find . -type f)
,chmod 755 $(find . -type d)
-perm
옵션을 잊지 마십시오 find
.
grep은 내 친구입니다. 진심으로.
.rb
텍스트가 포함 된 파일을 나열 하십시오 class foo
.
grep -l "class foo" .rb
텍스트가 포함 되지 않은.rb
파일을 나열 하십시오 .class foo
grep -L "class foo" *.rb
foo 또는 bar를 포함 하지 않는.rb
파일을 나열 하십시오 (regexp를 -e와 함께 사용할 수 있지만 연산자를 이스케이프해야 함).
grep -L -e "foo\|bar" *.rb
쉘 대체는 다음과 ^
같이 수행됩니다 .
/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory