Linux 입출력 스트림을 리디렉션합니다. 리눅스: 리디렉션. 기타 단순 필터

명시된 바와 같이 프로그램은 일반적으로 I/O용 표준 스트림을 처리하지만 쉘에는 I/O 리디렉션을 위한 특수 기능이 있습니다.

5.5.1 연산자 >,< и >>

" 기호는 리디렉션을 나타내는 데 사용됩니다. > ", "< " 그리고 " >> ". 가장 일반적인 용도는 명령 출력을 파일로 리디렉션하는 것입니다. 예는 다음과 같습니다.

$ ls -l > /home/jim/dir.txt

이 명령은 명령이 실행될 당시 현재 디렉토리의 파일 및 하위 디렉토리 목록을 /home/jim/dir.txt 파일에 저장합니다. ㅋㅋㅋ; 또한, 지정된 파일이 존재하지 않으면 생성됩니다. 존재하는 경우 덮어쓰게 됩니다. 명령 출력을 기존 파일 끝에 추가하려면 필요한 기호 대신 > 사용 >> . 이 경우 문자 앞이나 뒤에 공백이 있으면 > 또는 >> 중요하지 않으며 사용자의 편의를 위해서만 제공됩니다.

파일뿐만 아니라 다른 명령의 입력이나 장치(예: 프린터)에도 출력을 보낼 수 있습니다. 따라서 /home/jim/report.txt 파일의 단어 수를 계산하려면 다음을 사용할 수 있습니다. 다음 명령:

$ 고양이 /home/jim/report.txt > wc -w

파일을 인쇄하려면 다음 명령을 사용하십시오.

$ 고양이 /home/jim/report.txt > lpr

보시다시피 운영자님 > 출력 스트림을 리디렉션하는 역할을 합니다. 입력 스트림과 관련하여 유사한 기능이 연산자에 의해 수행됩니다. < . 특정 파일의 단어 수를 계산하는 위의 예제 명령은 다음과 같이 다시 작성할 수 있습니다(명령이 없음에 유의) 고양이):

$wc -w< /home/jim/report.txt

이 리디렉션 옵션은 일반적으로 키보드 입력을 허용(또는 예상)하는 명령에 대한 다양한 스크립트에서 자주 사용됩니다. 일부 일상적인 작업을 자동화하는 스크립트에서는 이 명령을 실행하기 위해 입력해야 하는 내용이 미리 기록되어 있는 파일에서 필요한 정보를 명령에 제공할 수 있습니다.

상징이라는 사실 때문에 < , > 그리고 >> 표준 스트림에서 작동하는 경우 일반적으로 수행되는 일반적인 방식뿐만 아니라 약간 다른 방식으로도 사용할 수 있습니다. 따라서 다음 명령은 동일합니다.

$ 고양이 > 파일

$cat>파일

$ >파일 고양이

$ > 파일 고양이

그러나 표준 스트림이 정의된 명령 없이는 리디렉션 기호 자체를 사용할 수 없으므로 다음과 같이 입력할 수 없습니다.

$파일1 > 파일2

파일 사본을 얻으십시오. 하지만 그렇다고 해서 그것이 덜 중요해지는 것은 아닙니다 이 메커니즘, 모든 명령에 대해 표준 흐름이 정의되어 있기 때문입니다. 이 경우 리디렉션할 수 있을 뿐만 아니라 표준 입력출력뿐만 아니라 다른 스트림도 가능합니다. 이렇게 하려면 리디렉션 기호 앞에 리디렉션된 스트림의 수를 지정하십시오. 표준 입력 stdin은 숫자 0입니다. 표준 출력표준 출력 - 숫자 1, 표준 스트림 stderr 오류 메시지는 2번입니다. 즉 전체 형식리디렉션 명령은 다음과 같습니다(> 근처의 공백은 선택 사항입니다).

명령 N>M

어디 N그리고 — 표준 스트림 수(0,1,2) 또는 파일 이름. 경우에 따라 기호 사용 < , > 그리고 >> 채널 번호나 파일 이름을 지정하지 않고는 기본적으로 누락된 번호, 즉 표준 출력을 1로 대체하기 때문에 가능합니다. 응, 교환원 > 숫자를 지정하지 않으면 다음과 같이 해석됩니다. 1 > .

단순히 표준 스트림을 리디렉션하는 것 외에도 스트림을 한 채널 또는 다른 채널로 리디렉션하는 것뿐만 아니라 표준 스트림 콘텐츠의 복사본을 만드는 것도 가능합니다. 이에 대한 특별한 기호가 있습니다. & 는 스트림이 리디렉션되는 채널 번호 앞에 배치됩니다.

명령 N > &M

이 명령은 채널 번호의 출력을 의미합니다. N표준 출력으로 전송되고 채널 번호로 복제됩니다. . 예를 들어, 오류 메시지를 표준 출력에 복제하려면 다음 명령을 제공해야 합니다. 2>&1, ~하는 동안 1>&2 stdout을 stderr로 복제합니다. 이 기능은 출력을 파일로 리디렉션할 때 특히 유용합니다. 그 이유는 화면에 메시지가 표시되고 파일에 저장되기 때문입니다.

5.5.2 연산자 |

출력 리디렉션을 위한 특수 옵션은 소프트웨어 채널(파이프 또는 컨베이어라고도 함)입니다. 이를 위해 이전 명령의 출력이 다음 명령의 입력 역할을 하는 두 개 이상의 명령을 수직 막대 문자("|")로 연결하거나 원하는 경우 구분합니다. 이 경우 기호 왼쪽에 있는 명령의 표준 출력 스트림은 | , 기호 오른쪽에 있는 프로그램의 표준 입력으로 전송됩니다. | . 예를 들어:

$ 고양이 마이파일 | 그렙 리눅스 | 화장실 -l

이 줄은 명령의 출력이 다음과 같음을 의미합니다. 고양이, 즉 myfile 파일의 텍스트가 명령 입력으로 전송됩니다. grep, "Linux"라는 단어가 포함된 줄만 강조 표시됩니다. 명령 출력 grep그러면 명령 입력으로 연결됩니다. 화장실 -l, 해당 줄의 수를 계산합니다.

프로그램 파이프는 각각 입력 스트림에서 특정 변환만 수행하는 여러 개의 작은 프로그램을 결합하여 좀 더 복잡한 변환을 초래하는 일반화된 명령어를 만드는 데 사용됩니다.

셸은 파이프라인에 포함된 모든 명령을 동시에 실행하도록 호출하고 각 명령에 대해 별도의 셸 인스턴스를 시작하므로 첫 번째 프로그램이 출력 스트림에서 무언가를 생성하기 시작하자마자 다음 명령이 처리를 시작합니다. 동일한 방식으로 각 후속 명령은 자체 작업을 수행하여 이전 명령의 데이터를 기다리고 그 결과를 다음 명령의 입력으로 생성합니다. 다음 명령이 시작되기 전에 명령을 완전히 완료하려면 해당 명령을 한 줄에 파이프라인 기호로 사용할 수 있습니다. | 및 세미콜론 ; . 각 세미콜론 앞에는 셸이 중지되고 파이프라인에 포함된 모든 이전 명령이 실행이 완료될 때까지 기다립니다.

파이프의 종료 상태(프로그램 완료 후 반환된 부울 값)는 파이프라인의 마지막 명령에서 반환된 종료 상태와 동일합니다. 파이프라인의 첫 번째 명령 앞에 "!" 기호를 넣으면 파이프라인의 종료 상태가 마지막 명령의 종료 상태를 논리적으로 부정하게 됩니다. 셸은 반환 값을 설정하기 전에 모든 파이프라인 명령이 완료될 때까지 기다립니다.

5.5.3 필터

위의 마지막 예(명령어 사용) grep)은 또 다른 중요한 개념, 즉 필터 프로그램을 설명하는 데 사용될 수 있습니다. 필터는 입력 데이터 스트림을 가져와 일부 변환을 수행하고 결과를 표준 출력(사용자 재량에 따라 다른 곳으로 리디렉션할 수 있는 곳)으로 출력하는 명령(또는 프로그램)입니다. 필터 명령에는 위에서 이미 언급한 명령이 포함됩니다. 고양이, 더, 더 적게, 화장실, cmp, diff, 다음 명령도 마찬가지입니다.

표 5.1.필터 명령

간단한 설명

grep, fgrep, egrep

입력 파일이나 표준의 데이터를 검색하세요. 입력 문자열포함하는 지정된 템플릿, 표준 출력으로 출력

주어진 목록에 나열된 입력 스트림에서 발생하는 모든 문자를 두 번째 지정된 목록의 해당 문자로 바꿉니다.

통신

두 파일을 한 줄씩 비교하고 3개의 열을 표준 출력으로 출력합니다. 하나는 1개의 파일에만 나타나는 줄, 두 번째는 두 번째 파일에만 나타나는 줄, 세 번째는 두 파일에 모두 나타나는 줄입니다.

인쇄를 위해 텍스트 파일이나 표준 입력 내용의 형식을 지정합니다.

sed

입력 데이터 스트림(파일 또는 표준 입력에서 가져옴)에서 일부 변환을 수행하는 데 사용되는 문자열 편집기

특수 필터는 명령입니다 , 입력 스트림을 "분할"하여 한쪽에서는 표준 출력으로, 다른 쪽에서는 파일(이름을 지정해야 함)로 보냅니다. 그 동작으로 명령이 실행된다는 것을 쉽게 알 수 있습니다. 리디렉션 연산자와 유사 1>파일(&F).

필터 기능은 정규식을 사용하여 크게 확장할 수 있습니다. 예를 들어 다양하고 종종 매우 복잡한 패턴을 사용하여 검색을 구성할 수 있습니다.

리디렉션과 필터에 관해 많은 말이 있을 수 있습니다. 그러나 이 자료는 Petersen [P1.4] 및 Kelly-Bootle [P1.8]과 ​​같이 UNIX 및 Linux에 관한 대부분의 책에서 사용할 수 있습니다. 따라서 우리는 말한 내용으로 제한하고 소위 환경 또는 쉘이 생성하는 환경을 고려하는 것으로 넘어갈 것입니다.

V. Kostromin(rus-linux 닷넷의 kos) - 5.5. I/O 리디렉션, 채널 및 필터

데이터를 쓰려면 파일또는 거기에서 읽으려면 프로세스가 먼저 이 파일을 열어야 합니다(쓰기 위해 연 경우 먼저 파일을 만들어야 할 수도 있음). 이 경우 프로세스는 다음을 수신합니다. 설명자열린 파일의 (설명자)는 이 프로세스에 고유한 번호이며 모든 쓰기 작업에 사용됩니다. 첫 번째 파일 열기핸들을 받게 되고, 두 번째 핸들은 1을 받게 됩니다. 파일 작업을 마친 후 프로세스 닫는다그러면 핸들이 해제되어 재사용할 수 있습니다. 파일을 닫지 않고 프로세스가 종료되면 시스템이 이를 수행합니다. 엄밀히 말하면 설명자 열기 작업만 사용할 파일을 지정합니다. 일반 파일과 홀 파일(대개 터미널) 모두 채널, 파이프라인..파이프라인 섹션에 설명되어 있습니다. 추가 작업 - 읽기, 쓰기 및 닫기, 핸들 사용 데이터 흐름, 그리고 이 흐름이 정확히 어디로 이어지는지는 중요하지 않습니다.

모든 리눅스 프로세스시작된다 시스템에서 "파일"을 열었습니다. 첫 번째 손잡이(손잡이)가 열려 있습니다. 독서, 이것 표준 입력프로세스. 파일 설명자를 지정하지 않는 한 모든 읽기 작업이 작동하는 것은 표준 입력입니다. 두 번째(설명자 1)는 쓰기용으로 열려 있습니다. 표준 출력프로세스. 파일 설명자가 명시적으로 지정되지 않는 한 모든 쓰기 작업은 이를 통해 작동합니다. 마지막으로 세 번째 데이터 스트림(설명자 2)은 진단 메시지를 출력하기 위한 것입니다. 표준 오류 출력. 이 세 개의 핸들은 프로세스가 시작될 때 이미 열려 있으므로 프로세스 자체에서 연 첫 번째 파일에는 핸들 3이 있을 가능성이 높습니다.

데이터 스트림의 설명자, 오픈 프로세스. 설명자에는 다음부터 번호가 매겨집니다. 새로운 데이터 스트림이 열리면 해당 설명자에는 현재 사용되지 않는 가장 낮은 번호가 할당됩니다. 세 개의 미리 열린 핸들: 표준 입력 (), 표준 출력(1) 그리고 표준 오류 출력(2) 시작 시 프로세스에 발행됩니다.

복사 메커니즘 환경강의에 설명된 는 무엇보다도 상위 프로세스의 열려 있는 모든 핸들을 하위 프로세스에 복사하는 것을 의미합니다. 결과적으로 상위 프로세스와 하위 프로세스 모두 동일한 핸들 아래에 동일한 데이터 스트림을 갖습니다. 시작되면 시작 명령 해석기 , 미리 열린 세 가지 설명자는 모두 다음과 연관되어 있습니다. 단말기(보다 정확하게는 해당 tty 유형의 구멍 파일을 사용하여): 사용자는 키보드에서 명령을 입력하고 화면에서 메시지를 봅니다. 따라서 셸에서 실행되는 모든 명령은 동일한 터미널로 출력되고 모든 명령은 실행됩니다. 대화형으로(백그라운드가 아님) - 거기에서 들어갑니다.

표준 출력

Methodius는 일부 프로그램이 터미널뿐만 아니라 파일(예: 지정 시 정보)에도 출력할 수 있다는 사실을 이미 경험했습니다. 파라메트릭 키" -o " 뒤에 파일 이름이 오면 수동 텍스트를 모니터에 표시하는 대신 파일로 출력합니다. 프로그램 개발자가 이러한 키를 제공하지 않더라도 Methodius는 프로그램 출력을 모니터에 표시하는 대신 파일에 저장하는 다른 방법을 알고 있습니다. ">" 기호를 넣고 그 뒤에 파일 이름을 표시하는 것입니다. 따라서 Methodius는 이미 짧은 내용을 만들었습니다. 텍스트 파일(스크립트) cat 유틸리티를 사용합니다(파일 및 디렉토리에 대한 프로세스 액세스 강의 참조).

$ cat > textfile 예시 파일입니다. ^D $ ls -l textfile -rw-r--r-- 1 methody methody 23 11월 15일 16:06 textfile

실시예 2. 표준 출력을 파일로 리디렉션

물론 ">" 기호를 사용한다고 해서 cat 유틸리티 자체의 기능이 확장되는 것은 아닙니다. 게다가 이 예의 고양이는 껍데기매개변수 없음: ">" 기호 없음, 후속 파일 이름 없음. 이 경우 cat은 출력 데이터가 모니터 화면, 파일 또는 다른 곳에서 끝나는 위치를 알지 못한 채(심지어 관심도 없이) 평소처럼 작업했습니다. 출력 자체가 최종 대상(사람이든 파일이든)에 도달하는지 확인하는 대신 cat은 모든 데이터를 다음으로 보냅니다. 표준 출력(약어로 stdout).

표준 출력을 바꾸는 것은 쉘의 작업입니다. 이 예에서 쉘은 다음을 생성합니다. 빈 파일, 그 이름은 ">" 기호 다음에 지정되며 이 파일의 설명자는 cat 프로그램에 숫자 1로 전달됩니다( 표준 출력). 이것은 매우 간단하게 수행됩니다. 파일 및 디렉터리에 대한 프로세스 액세스 강의에서 우리는 쉘에서 명령이 실행되는 방법에 대해 이야기했습니다. 특히, fork()를 실행한 후 두 개의 동일한 프로세스가 나타나고 그 중 하나(자식)가 자신 대신 명령을 실행해야 합니다(exec() 실행). 그래서 그 사람은 그 전에 닫는다표준 출력(핸들 1이 해제됨) 및 열립니다파일(링크됨 첫 번째자유 설명자, 즉 1), 실행되는 명령은 아무것도 알 필요가 없습니다. 해당 명령의 표준 출력은 이미 대체되었습니다. 이 작업을 리디렉션표준 출력. 파일이 이미 존재하는 경우 쉘은 해당 파일을 다시 작성하여 이전에 포함된 모든 것을 완전히 삭제합니다. 따라서 Methodius가 계속해서 텍스트 파일에 데이터를 쓰려면 ">>"라는 또 다른 작업이 필요합니다.

$ cat >> textfile 예시 1. ^D $ cat textfile 예시 파일입니다. 예시 1. $

실시예 3. 표준 출력의 비파괴 리디렉션

Methodius는 필요한 결과를 정확하게 얻었습니다. 그는 다음 명령의 표준 출력 데이터를 이미 존재하는 파일의 끝에 추가했습니다.

표준 출력 각 프로세스가 시작될 때 시스템에 의해 열리고 프로세스의 데이터 출력을 위한 데이터 스트림입니다.

표준 입력

마찬가지로 데이터를 프로그램 입력으로 전송하려면 다음을 사용할 수 있습니다. 표준 입력(약어로 stdin). 명령줄 작업 시 표준 입력은 사용자가 키보드에서 입력하는 문자입니다. 표준 입력은 명령 셸을 사용하여 파일에서 데이터를 공급하여 리디렉션할 수 있습니다. 기호 "< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла»는 파일의 정렬 데이터를 입력으로 제공합니다.

$sort< textfile Пример 1. Это файл для примеров. $

실시예 4. 파일에서 표준 입력 리디렉션

이 명령의 효과는 sort textfile 명령과 완전히 동일합니다. 차이점은 "< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

">" 작업은 기억할 가치가 있습니다. 파괴적인: 항상 길이가 0인 파일을 생성합니다. 따라서 예를 들어 데이터 정렬을 위해 파일에정렬은 순차적으로 적용되어야 합니다. < файл >새로운 파일그리고 MV new_file 파일. 보기 명령 팀< файл >같은_파일간단히 길이를 0으로 줄이겠습니다!

표준 입력 각 프로세스가 시작될 때 시스템에 의해 열리고 데이터 입력을 위한 데이터 스트림입니다.

표준 오류 출력

첫 번째 예제와 리디렉션 연습으로 Methodius는 cat.info 파일에 cat에 대한 가이드를 작성하기로 결정했습니다.

$ info cat > cat.info info: 쓰기 노드(coreutils.info.bz2)cat 호출... info: 완료되었습니다. $ head -1 cat.info 파일: coreutils.info, Node: cat 호출, Next: tac 호출, Up: 전체 파일 출력 $

실시예 5. 표준 오류 출력

놀란 Methodius는 파일로 이동하라는 지시에도 불구하고 info 명령에 의해 출력된 두 줄이 여전히 터미널에 있다는 사실을 발견했습니다. 분명히 이 줄은 포함되지 않았습니다. 표준 출력프로그램이 출력해야 하는 매뉴얼과 직접적인 관련이 없기 때문에 사용자에게 작업 진행 상황, 즉 매뉴얼을 파일에 기록하는 방법을 알려줍니다. 이런 종류의 경우 진단 메시지, 프로그램 실행 중에 발생한 오류 메시지뿐만 아니라 Linux에서는 표준 오류 출력(약어로 stderr).

표준 오류 출력 시스템이 시작될 때 각 프로세스에 대해 열리는 데이터 스트림입니다. 진단 메시지, 프로세스에 의해 출력됩니다.

표준 출력과 함께 표준 오류 출력을 사용하면 프로그램의 실제 결과를 다양한 수반 정보로부터 분리할 수 있습니다. 다른 파일. 표준 오류 출력은 문자 조합 "2"를 사용하여 표준 I/O와 동일한 방식으로 리디렉션될 수 있습니다.

$ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: 쓰기 노드(coreutils.info.bz2)cat 호출... info: 완료되었습니다. $

실시예 6. 표준 오류 출력 리디렉션

이번에는 터미널에 아무 것도 도착하지 않았으며 표준 출력은 cat.info 파일로, 표준 오류 출력은 cat.stderr로 이동했습니다. ">"와 "2" 대신에 Methodius는 "1>"과 "2>"를 쓸 수도 있었습니다. 이 경우 숫자는 설명자 번호를 나타냅니다. 열 수 있는파일. 일부 유틸리티가 수신을 기대하는 경우 열려 있는예를 들어 4와 같은 숫자가 포함된 설명자를 사용하여 실행합니다. 반드시“4>” 조합을 사용해야 합니다.

그러나 표준 출력과 표준 오류 출력을 분리하지 않고 단일 파일로 결합하려는 경우도 있습니다. 안에 명령 셸 Bash에는 이를 위한 특별한 순서인 "2>&1"이 있습니다. 이는 "표준 출력과 동일한 위치에 표준 오류 출력을 직접적으로" 의미합니다.

$ info cat > cat.info 2>&1 $ head -3 cat.info info: 쓰기 노드(coreutils.info.bz2)cat 호출... info: 완료되었습니다. 파일: coreutils.info, 노드: cat 호출, 다음: tac 호출, 위로: 전체 파일 출력 $

실시예 7. 표준 출력과 표준 오류 출력 결합

이 예에서는 리디렉션 순서가 중요합니다. 명령줄에서 Methodius는 먼저 표준 출력(“> cat.info”)을 리디렉션할 위치를 지정한 다음 표준 오류 출력을 그곳으로 리디렉션하도록 명령했습니다. 만약 반대 방향(“2>&1 > cat.info”)으로 수행했다면 결과는 예상치 못했을 것입니다. 표준 출력만 파일에 들어가고 진단 메시지가 터미널에 나타났을 것입니다. 그러나 여기서의 논리는 철통적입니다. "2>&1" 작업이 실행될 때 표준 출력이 터미널과 연결되었습니다. ~ 후에실행하면 표준 오류 출력도 터미널과 연결됩니다. 물론 이후에 표준 출력을 파일로 리디렉션해도 표준 오류 출력에는 어떤 방식으로도 영향을 미치지 않습니다. 구성 "&number"의 숫자는 숫자입니다. 열려 있는설명자. 네 번째 설명자에 쓰는 위의 유틸리티가 셸에서 작성된 경우 " >&4 "와 같은 리디렉션을 사용합니다. 번거로운 구성인 "> file 2>&1"을 입력하지 않기 위해 bash는 " &> file" 또는 " >& file"과 같은 약어를 사용합니다.

아무데도 리디렉션하지 않음

때로는 프로그램의 일부 데이터 출력이 필요하지 않은 것으로 알려져 있습니다. 예를 들어 표준 오류 출력의 경고입니다. 이 경우 표준 오류 출력을 다음으로 리디렉션할 수 있습니다. 파일 구멍, 데이터 삭제를 위해 특별히 설계되었습니다 - /dev/null . 이 파일에 기록된 모든 내용은 간단히 폐기되며 어디에도 저장되지 않습니다.

$ 정보 고양이 > cat.info 2 > /dev/null $

실시예 8. /dev/null로 리디렉션

똑같은 방법으로 표준 출력을 /dev/null 로 보내서 제거할 수 있습니다.

Linux에 내장된 리디렉션 기능은 모든 종류의 작업을 위한 광범위하고 단순화된 도구를 제공합니다. 다양한 I/O 스트림을 관리하는 기능은 복잡한 시스템을 개발할 때와 마찬가지로 생산성을 크게 향상시킵니다. 소프트웨어, 명령줄을 사용하여 파일을 관리할 때.

I/O 스레드

Linux 환경의 입력 및 출력은 다음 세 가지 스레드에 분산됩니다.

  • 표준 입력(표준 입력, stdin, 스레드 번호 0)
  • 표준 출력(stdout, 번호 1)
  • 표준 오류 또는 진단 스트림(표준 오류, stderr, 숫자 2)

사용자가 터미널과 상호 작용할 때 표준 입력은 사용자의 키보드를 통해 전송됩니다. 표준 출력과 표준 오류는 사용자 터미널에 텍스트로 표시됩니다. 이 세 가지 스트림을 모두 표준 스트림이라고 합니다.

표준 입력

표준 입력 스트림은 일반적으로 사용자로부터 프로그램으로 데이터를 전달합니다. 표준 입력이 필요한 프로그램은 일반적으로 장치(예: 키보드)에서 입력을 받습니다. 표준 입력은 EOF(파일 끝)에 도달하면 중지됩니다. EOF는 더 이상 읽을 데이터가 없음을 나타냅니다.

표준 입력이 어떻게 작동하는지 보려면 cat 프로그램을 실행하십시오. 이 도구의 이름은 "연결하다"(무언가를 연결하거나 결합하다)를 의미합니다. 일반적으로 이 도구는 두 파일의 내용을 결합하는 데 사용됩니다. 인수 없이 실행하면 cat은 명령 프롬프트를 열고 표준 입력의 내용을 받아들입니다.

이제 숫자를 입력하세요.

1
2
3
Ctrl-d

숫자를 입력하고 Enter 키를 누르면 데이터를 받아들이는 실행 중인 cat 프로그램에 표준 입력을 보냅니다. 그러면 cat 프로그램은 수신된 입력을 표준 출력에 표시합니다.

사용자는 ctrl-d를 눌러 EOF를 설정할 수 있으며, 그러면 cat 프로그램이 중지됩니다.

표준 출력

표준 출력은 프로그램에서 생성된 데이터를 기록합니다. 표준 출력이 리디렉션되지 않은 경우 터미널에 텍스트가 출력됩니다. 예시로 다음 명령을 실행해 보세요.

echo 표준 출력을 통해 터미널로 전송됩니다.

추가 옵션 없이 echo 명령은 명령줄에서 전달된 모든 인수를 화면에 표시합니다.

이제 인수 없이 echo를 실행합니다.

이 명령은 빈 문자열을 반환합니다.

표준 에러

이 표준 스트림은 오류를 기록합니다. 프로그램에 의해 생성된, 이는 고장났습니다. 표준 출력과 마찬가지로 이 스트림은 데이터를 터미널로 보냅니다.

ls 명령 오류 스트림의 예를 살펴보겠습니다. ls 명령은 디렉터리의 내용을 표시합니다.

인수가 없으면 이 명령은 현재 디렉터리의 내용을 반환합니다. ls에 인수로 디렉터리 이름을 제공하면 명령은 해당 내용을 반환합니다.

% 디렉토리가 존재하지 않으므로 명령은 표준 오류를 반환합니다.

ls: %에 접근할 수 없습니다: 해당 파일이나 디렉터리가 없습니다

스트림 리디렉션

Linux는 각 스레드를 리디렉션하는 특수 명령을 제공합니다. 이 명령은 표준 출력을 파일에 기록합니다. 출력이 not로 리디렉션되는 경우 기존 파일, 명령이 생성됩니다 새로운 파일해당 이름으로 리디렉션된 출력을 해당 이름으로 저장합니다.

꺾쇠 괄호가 하나 있는 명령은 대상 파일의 기존 내용을 덮어씁니다.

  • > - 표준 출력
  • < — стандартный ввод
  • 2> - 표준 오류

이중 꺾쇠 괄호가 있는 명령은 대상 파일의 내용을 덮어쓰지 않습니다.

  • >> - 표준 출력
  • << — стандартный ввод
  • 2>> - 표준 오류

다음 예를 고려하십시오.

고양이 > write_to_me.txt



Ctrl-d

이 예에서는 cat 명령을 사용하여 출력을 파일에 기록합니다.

write_to_me.txt의 내용을 검토하십시오.

고양이 write_to_me.txt

명령은 다음을 반환해야 합니다.

cat을 write_to_me.txt로 다시 리디렉션하고 세 개의 숫자를 입력하세요.

고양이 > write_to_me.txt
1
2
3
Ctrl-d

이제 파일 내용을 확인해 보세요.

고양이 write_to_me.txt

명령은 다음을 반환해야 합니다.

보시다시피 출력을 리디렉션하는 명령이 단일 꺾쇠 괄호를 사용했기 때문에 파일에는 최신 출력만 포함됩니다.

이제 두 개의 꺾쇠괄호를 사용하여 동일한 명령을 실행해 보세요.

고양이 >> write_to_me.txt



Ctrl-d

write_to_me.txt를 엽니다.

1
2
3


이중 꺾쇠 괄호가 있는 명령은 기존 내용을 덮어쓰지 않고 내용에 추가합니다.

컨베이어

파이프는 한 명령의 출력을 다른 명령의 입력으로 리디렉션합니다. 이 경우 두 번째 프로그램으로 전송된 데이터는 단말기에 표시되지 않습니다. 데이터는 두 번째 프로그램에서 처리한 후에만 화면에 나타납니다.

Linux의 파이프라인은 수직 막대로 표시됩니다.

예를 들어:

이 명령은 ls의 출력(현재 디렉터리의 내용)을 less로 전달하여 전달된 데이터를 한 줄씩 표시합니다. 일반적으로 ls는 디렉토리의 내용을 줄로 나누지 않고 연속적으로 표시합니다. ls의 출력을 less로 리디렉션하면 마지막 명령출력을 여러 줄로 나눕니다.

보시다시피 파이프라인은 데이터를 파일로만 리디렉션하는 > 및 >>와 달리 한 명령의 출력을 다른 명령의 입력으로 리디렉션할 수 있습니다.

필터

필터는 파이프라인의 리디렉션과 출력을 변경할 수 있는 명령입니다.

메모: 필터도 기본입니다 리눅스 명령, 컨베이어 없이 사용할 수 있습니다.

  • find - 이름으로 파일을 검색합니다.
  • grep – 주어진 패턴을 사용하여 텍스트를 검색합니다.
  • tee – 표준 입력을 표준 출력 및 하나 이상의 파일로 리디렉션합니다.
  • tr – 문자열을 검색하고 바꿉니다.
  • wc - 문자, 줄, 단어를 계산합니다.

I/O 리디렉션의 예

이제 리디렉션의 기본 개념과 메커니즘에 익숙해졌으므로 이를 사용하는 몇 가지 기본 예를 살펴보겠습니다.

명령> 파일

이 패턴은 명령의 표준 출력을 파일로 리디렉션합니다.

ls ~> root_dir_contents.txt

이 명령은 시스템 루트 디렉터리의 내용을 표준 출력으로 전달하고 출력을 root_dir_contents 파일에 씁니다. 명령은 단일 꺾쇠 괄호를 사용하므로 파일의 이전 내용이 모두 삭제됩니다.

명령 > /dev/null

/dev/null은 원치 않는 콘솔 출력을 피하기 위해 표준 출력이나 진단을 억제하는 데 사용되는 특수 파일("널 장치"라고 함)입니다. /dev/null로 끝나는 모든 데이터는 삭제됩니다. /dev/null로의 리디렉션은 일반적으로 쉘 스크립트에서 사용됩니다.

ls > /dev/null

이 명령은 ls가 반환한 표준 출력을 /dev/null로 재설정합니다.

명령 2 > 파일

이 패턴은 명령의 표준 오류 스트림을 파일로 리디렉션하여 현재 내용을 덮어씁니다.

mkdir "" 2> mkdir_log.txt

이 명령은 잘못된 디렉터리 이름으로 인해 발생한 오류를 리디렉션하여 log.txt에 기록합니다. 참고: 오류가 여전히 터미널에 나타납니다.

명령 >> 파일

이 패턴은 파일의 현재 내용을 덮어쓰지 않고 명령의 표준 출력을 파일로 리디렉션합니다.

echo 새 파일에 기록 > data.txt
echo 기존 파일의 내용에 추가 >> data.txt

이 명령 쌍은 먼저 사용자 입력을 새 파일로 리디렉션한 다음 내용을 덮어쓰지 않고 기존 파일에 붙여넣습니다.

명령 2>>파일

이 패턴은 파일의 기존 내용을 덮어쓰지 않고 명령의 표준 오류 스트림을 파일로 리디렉션합니다. 로그 내용이 지속적으로 업데이트되지 않으므로 프로그램 또는 서비스 오류 로그를 생성하는 데 적합합니다.

"" 2> stderr_log.txt 찾기
화장실 "" 2>> stderr_log.txt

위 명령은 잘못된 find 인수로 인해 발생한 오류 메시지를 stderr_log.txt 파일로 리디렉션한 다음 잘못된 wc 인수로 인해 발생한 오류 메시지를 stderr_log.txt 파일에 추가합니다.

팀 | 팀

이 패턴은 첫 번째 명령의 표준 출력을 두 번째 명령의 표준 입력으로 리디렉션합니다.

/var lib 찾기 | 그렙 뎁

이 명령은 /var 디렉터리와 그 하위 디렉터리에서 파일 이름과 deb 확장자를 검색하고 파일 경로를 반환하며 검색 패턴을 빨간색으로 강조 표시합니다.

팀 | 티 파일

이 패턴은 명령의 표준 출력을 파일로 리디렉션하고 해당 내용을 덮어쓴 다음 리디렉션된 출력을 터미널에 표시합니다. 지정한 파일이 없으면 새 파일을 생성합니다.

안에 이 템플릿 tee 명령은 일반적으로 프로그램의 출력을 보고 동시에 파일에 저장하는 데 사용됩니다.

화장실 /etc/magic | 티magic_count.txt

이 명령은 매직 파일(Linux에서는 이를 사용하여 파일 유형을 결정함)의 문자, 행 및 단어 수를 tee 명령에 전달합니다. tee 명령은 이 데이터를 터미널과 Magic_count.txt 파일로 보냅니다.

팀 | 팀 | 명령 >> 파일

이 템플릿은 첫 번째 명령의 표준 출력을 리디렉션하고 다음 두 명령을 통해 필터링한 후 최종 결과를 파일에 추가합니다.

ㅋㅋㅋ ~ | grep *tar | tr e E >> ls_log.txt

이 명령은 디렉터리에 대한 ls 출력을 보냅니다. 루트 명령 grep. 그러면 grep은 수신된 데이터를 검색합니다. tar 파일. 그런 다음 grep의 결과는 tr 명령에 전달되어 모든 e 문자를 문자 E로 대체합니다. 결과 결과는 ls_log.txt 파일에 추가됩니다(해당 파일이 없으면 명령은 다음을 생성합니다). 자동으로).

결론

Linux I/O 리디렉션 기능은 처음에는 지나치게 복잡해 보입니다. 그러나 리디렉션 작업은 시스템 관리자의 가장 중요한 기술 중 하나입니다.

특정 명령에 대해 자세히 알아보려면 다음을 사용하세요.

남자 명령 | 더 적은

예를 들어:

이 명령은 반환됩니다 전체 목록티에 대한 명령.

태그:

리눅스의 I/O 시스템.

I/O 시스템에서 모든 외부 장치는 일반적인 파일 작업을 수행할 수 있는 파일로 처리됩니다. 물론 장치 드라이버도 있지만 그 인터페이스는 사용자가 특수 파일에 액세스하도록 설계되었습니다. 특수 파일은 입출력 시스템을 통합하는 수단입니다.

연결된 각 장치(터미널, 디스크, 프린터 등)는 하나 이상의 특수 파일에 해당합니다. 이들 중 대부분은 특수 파일/dev 디렉토리에 저장됩니다:
$ CD /개발
$ ls -l
온솔 시스템 제어판
디스크의 dsk 부분
fd0 플로피 디스크 1
메모리
LP 프린터
lр0 병렬 포트 0
. . .
루트 파일 시스템에 대한 디스크의 루트 부분
스왑 스왑 부분
콘솔의 syscon 대체 이름
systty는 시스템 콘솔의 또 다른 이름입니다.
터미널용 용어 디렉토리
ttyS0 직렬 포트 0(COM1)
. . .

프로그램이 이러한 특수 파일에 쓰면 OS 시스템은 이를 가로채서 프린터와 같은 장치로 보냅니다. 이러한 유형의 파일에서 데이터를 읽을 때 실제로는 디스크와 같은 장치에서 수신됩니다. 프로그램은 입/출력 장치의 작동 기능을 고려해서는 안 됩니다. 이를 위해 OS 커널 구성 요소와 범용 응용 프로그램 간의 인터페이스 역할을 하는 특수 파일(드라이버)이 사용됩니다.

시스템이 차이점을 감지합니다. 일반 파일해당 항목을 분석한 후에만 특별 항목에서 아이노드, 이는 디렉토리 항목에서 참조됩니다.
특수 파일 inode에는 장치 클래스, 유형 및 번호에 대한 정보가 포함되어 있습니다. 장치 클래스는 문자 기반 장치와 블록 기반 장치를 모두 정의합니다. 문자별 장치의 예로는 키보드가 있습니다. 이러한 유형의 장치와의 통신을 제공하는 특수 파일을 바이트 지향이라고 합니다. 블록 장치는 대규모 정보 블록을 교환하는 것이 특징이며, 이로 인해 교환 속도가 빨라지고 효율성이 높아집니다. 모든 디스크 장치는 블록 교환을 지원하며 이를 제공하는 특수 파일을 블록 지향이라고 합니다. 특수 파일에는 기호 정보가 포함되어 있지 않으므로 해당 길이가 디렉토리 목록에 표시되지 않습니다.

장치의 유형과 번호는 특수 파일의 주요 특징이기도 합니다(해당 장치의 기본 번호와 추가 번호는 길이 필드에 배치됩니다). 첫 번째는 장치 유형을 결정하고 두 번째는 유사한 장치 중에서 장치를 식별합니다. OS는 수십, 심지어 수백 개의 터미널을 동시에 서비스할 수 있습니다. 각각에는 고유한 특수 파일이 있어야 하므로 기본 번호와 추가 번호가 있으면 장치와 해당 파일 간에 필요한 통신을 설정할 수 있습니다.

하나의 디스크에 여러 파일 시스템을 생성할 수 있습니다. 일부 시스템은 디스크당 하나의 파일 시스템을 사용하는 반면 다른 시스템은 여러 개를 사용합니다. mkfs 명령을 사용하여 새 파일 시스템을 생성할 수 있습니다(make 파일 시스템). 예를 들어, # /sbin/mkfs /dev/dsk/fl1 512라는 표현은 크기가 512 블록인 플로피 디스크 b:를 생성한다는 의미입니다.

선택적으로 파일 시스템의 크기(블록)와 i-노드 수(즉, 파일 시스템에 저장할 수 있는 최대 파일 수)를 지정할 수 있습니다. 기본적으로 i-노드 수는 블록 수를 4로 나눈 값과 같습니다. 한 파일 시스템의 최대 i-노드 수는 65,000개입니다. 어떤 이유로 디스크에 65,000개 이상의 i-노드가 필요한 경우 2개 이상을 생성해야 합니다. 파일 시스템이 디스크에.

모든 파일 시스템은 공유 디렉터리 트리의 어느 지점에서나 연결(마운트)될 수 있습니다. 예를 들어, / 디렉토리는 시스템의 루트 디렉토리이자 항상 마운트되는 파일 시스템의 기본 디렉토리입니다. /usr1 디렉터리는 / 디렉터리에 있지만 이 경우에는 루트 파일 시스템과 별도의 파일 시스템입니다. 그 안에 있는 모든 파일은 디스크의 별도 부분이나 완전히 별도의 디스크에 있기 때문입니다. /usr1 파일 시스템은 마운트된 파일 시스템입니다. 전체 계층 구조에서 /usr1 디렉토리가 존재하는 지점의 루트입니다(그림 1 및 2).

쌀. 1. 이전의 파일 시스템
/dev/dsk/os1 마운트

쌀. 2. 이후 파일 시스템
/dev/dsk/os1을 /usr/로 마운트

파일 시스템을 마운트하려면 /sbin/mount 명령을 사용하십시오. 이 명령을 사용하면 지정된 파일 시스템을 기존 디렉터리 구조의 어느 위치에나 배치할 수 있습니다.
#/sbin/mount/dev/dsk/osl/usr1은 /dev/dsk/osl을 /usr1에 마운트합니다.
#/sbin/mount/dev/dsk/flt/a는 /dev/dsk/flt를 /a에 마운트합니다.

쓰기 금지가 필요한 디스크에 파일 시스템을 마운트하여 시스템이 읽기 전용이 되도록 하려면 /sbin/mount 명령에 -r 옵션을 추가해야 합니다.
파일 시스템이 마운트되는 디렉터리는 현재 비어 있어야 합니다. 파일 시스템이 마운트되는 동안 해당 내용에 액세스할 수 없기 때문입니다.

예를 들어 LINUX 시스템에 마운트된 파일 시스템에 대한 정보를 얻으려면 인수 없이 /sbin/mount 명령을 사용할 수 있습니다(그림 3).

쌀. 삼.

이 명령은 파일 시스템(예: usrl)이 마운트된 디렉토리, 해당 파일 시스템이 있는 /dev 장치, 마운트된 시간과 날짜를 인쇄합니다. 파일 시스템을 마운트 해제하려면 /sbin/umount 명령을 사용하십시오. 역동작 mount 명령과 관련하여. 파일 시스템을 해제하고 디렉터리 구조에서 완전히 제거하므로 자체 파일과 디렉터리에 모두 액세스할 수 없게 됩니다.
# /sbin/umount /b
# /sbin/umount /dev/dsk/0s2

루트 파일 시스템은 마운트 해제할 수 없습니다. 또한 누군가가 마운트 해제하려는 파일 시스템의 파일을 사용하는 경우 umount 명령은 실패합니다(마운트 해제하려는 파일 시스템의 디렉터리 중 하나에 있는 것처럼 간단할 수도 있습니다).

mount 및 umount 명령에서 사용자는 물리적 디스크 장치의 약어를 사용합니다.
LINUX에서 디스크 장치에는 고유한 명칭이 있습니다. LINUX에서는 사용자가 정확하게 지정하는 문제에 결코 직면하지 않습니다. 물리적 장치, 정보가 있는 위치입니다. LINUX에서는 임의의 수의 외부 장치가 매우 클 수 있으므로 사용자는 필요한 파일이 있는 디렉터리의 이름만 다룹니다. 모든 파일 시스템은 일반적으로 시스템이 부팅될 때 한 번 마운트됩니다. 원격 컴퓨터의 파일 시스템을 일부 디렉터리에 마운트할 수도 있습니다.

LINUX의 물리적 장치에는 디스크 장치에 해당하는 파일이 포함된 dsk 및 rdsk 디렉터리가 있습니다. 일반적으로 이러한 디렉터리의 파일 이름은 동일하며 유일한 차이점은 rdsk 디렉터리에는 일부 시스템 장치가 더 많은 용도로 사용하는 특수 액세스(원시)가 있는 디스크 장치가 포함되어 있다는 것입니다. 빠른 접근디스크에. 하나의 일반적인 dsk 디렉토리에는 다음이 포함됩니다. 다음 장치:
$1초 /dev/dsk
0s0 1s0 c0t0d0s0 c0tld0s0 f0 f05q f13dt fld8d
0sl 1sl c0t0d0sl c0tld0sl f03d f05qt f13h fld8dt
0s2 1s2 c0t0d0s2 c0tld0s2 f03dt f0d8d f13ht fld8t
. . .
$

LINUX 시스템에서 디스크 장치는 파티션 테이블 MasterBoot MS DOS에 정의된 파티션과 유사하게 논리적으로 섹션으로 구분됩니다. 파일 0s1, 0s2, 0s3 등은 디스크 번호 0의 ​​섹션 1, 2, 3 등에 해당합니다. 파일 1s0, 1sl, 1s2 등은 디스크 번호 1의 섹션 1, 2, 3 등에 해당합니다. . 더 많은 디스크, 섹션 번호는 n으로 지정된 각 디스크에 대해 ns0, nsl 등으로 지정됩니다.

많은 수의 시스템 디스크 장치다음 번호 매기기 시스템을 사용하십시오.
컨트롤러 d 디스크 섹션 포함

여기서 컨트롤러는 디스크 컨트롤러 번호입니다. 디스크 - 디스크 번호; 섹션 - 디스크 섹션 번호.
따라서 0s0은 일반적으로 c0t0d0s0과 동일하고 0sl은 c0t0d0sl과 동일하며 세 문자 섹션 이름은 단순히 디스크 컨트롤러숫자 0으로.

이름이 f 정의로 시작하는 파일 다른 종류플로피 디스크. rmt 디렉토리에는 자기 테이프 장치의 파일이 포함되어 있습니다.
$1초 /dev/rmt
c0s0 cls0 c3s0 ntape ntapel 테이프 테이프

c0s0, cls0, c2s0 및 c3s0 파일은 4개의 카세트 테이프 저장 장치를 정의합니다. 테이프 및 테이프 파일은 2릴 자기 저장 장치를 정의합니다. 이름이 n으로 시작하는 파일은 동일한 장치에 속하며 테이프만 사용 후 되감지 않습니다. 반면 다른 파일을 사용하면 해당 파일을 사용하는 프로그램 실행이 끝나면 테이프가 되감기게 됩니다.

일부 시스템에서는 이러한 파일의 이름이 다르지만 모두 항상 /dev에 있으며 일반적으로 시스템과 함께 제공되는 사전에는 장치 및 관련 파일에 대한 자세한 설명이 포함되어 있습니다.

extX 파일 시스템은 I/O 작업에 데이터 버퍼링을 사용합니다. 정보 블록을 읽을 때 커널은 여러 인접 블록에 I/O 요청을 보냅니다. 이러한 작업은 파일을 순차적으로 읽을 때 데이터 검색 속도를 크게 향상시킵니다. 파일에 데이터를 쓸 때 extX 파일 시스템은 새 블록을 쓸 때 근처에 최대 8개의 인접한 블록을 미리 할당합니다. 이 방법을 사용하면 파일을 인접한 블록에 배치할 수 있으므로 읽기 속도가 빨라지고 높은 시스템 성능을 달성할 수 있습니다.

메모: 연습에서는 Kerberos 구성 섹션을 건너뛸 수 있음을 보여줍니다. Samba가 Kerberos 구성 자체를 구성하는 것 같습니다. 패키지가 서 있을 만큼 충분합니다. krb5-사용자.

담당

Linux 시스템에 로그인해야 하는 경우가 종종 있습니다. 기존 도메인윈도우. 예를 들어 Samba를 사용하여 파일 서버를 만드는 경우입니다. 이는 매우 쉽습니다. 필요한 것은 Kerberos 클라이언트, Samba 및 Winbind뿐입니다.

설치하기 전에 다음을 업데이트하는 것이 좋습니다.

sudo 적성 업데이트

sudo 적성 업그레이드

다음 명령을 사용하여 이 모든 항목을 설치할 수 있습니다.

sudo 적성 설치 krb5-user samba winbind

다음 라이브러리를 설치해야 할 수도 있습니다.

sudo 적성 설치 libpam-krb5 libpam-winbind libnss-winbind

아니면 당신이 사용하는 경우 우분투 데스크탑, Synaptic 패키지 관리자를 통해 동일한 패키지를 설치할 수 있습니다.

다음으로, 도메인에서 작동하도록 위의 모든 도구를 구성해야 합니다. 도메인 컨트롤러가 IP 주소 192.168.0.1인 서버 dc.domain.com인 DOMAIN.COM 도메인에 로그인한다고 가정해 보겠습니다. 같은 서버도 마찬가지 기본 DNS도메인 서버. 또한 IP 192.168.0.2를 사용하는 DNS-dc2.domain.com이라고도 알려진 두 번째 도메인 컨트롤러 1)가 있다고 가정해 보겠습니다. 컴퓨터 이름은 smbsrv01입니다.

DNS 설정

먼저 컴퓨터의 DNS 설정을 변경하고 다음으로 등록해야 합니다. DNS 서버및 domaincontroller 2) 및 원하는 도메인을 검색 도메인으로 지정합니다.

고정 IP 주소가 있는 경우 Ubuntu 데스크탑에서는 Network Manager를 통해 이 작업을 수행할 수 있습니다. Ubuntu Server에서는 /etc/resolv.conf 파일의 내용을 다음과 같이 변경해야 합니다.

도메인 domain.com

searchdomain.com

네임서버 192.168.0.1

네임서버 192.168.0.2

최신 배포판에서는 resolv.conf 파일이 자동으로 생성되므로 수동으로 편집할 필요가 없습니다. 원하는 결과를 얻으려면 파일에 필요한 변경 사항을 추가해야 합니다. /etc/resolvconf/resolv.conf.d/head추가될 데이터는 /etc/resolv.conf 파일에 자동으로 삽입됩니다.

IP 주소가 동적이며 할당된 경우 DHCP 서버 resolv.conf를 재부팅한 후 "잘못된" resolv.conf"가 형성될 수 있습니다. 예를 들어 네임서버 192.168.0.1이 하나만 있고 도메인과 검색이 지정되지 않았습니다. /etc/dhcp/dhclient.conf를 편집해야 합니다. 도메인 및 검색 항목을 표시하려면 대체 도메인 이름 줄 앞에 있는 주석을 삭제하고 도메인을 입력해야 합니다.

도메인 이름 "domain.com"을 대체합니다.

다른 네임서버를 추가하려면 domain-name-servers 앞에 주석을 제거하고 서버 IP를 지정해야 합니다.

도메인 이름 서버 앞에 192.168.0.2를 추가합니다.

변경 사항을 적용하려면 서비스를 다시 시작하기만 하면 됩니다.

/etc/init.d/networking 재시작

이제 설정했는지 확인하세요. 원하는 이름/etc/hostname 파일의 컴퓨터:

smbsrv01

또한 내부 IP 중 하나를 참조하는 컴퓨터의 전체 도메인 이름과 반드시 ​​짧은 호스트 이름이 포함된 항목을 포함하도록 /etc/hosts 파일을 편집해야 합니다.

# 이 컴퓨터의 이름

127.0.0.1 로컬호스트

127.0.1.1 smbsrv01.domain.com smbsrv01

도메인 컨트롤러가 짧은 이름과 전체 이름을 사용하여 정상적으로 핑을 보내고 있는지 즉시 확인해야 합니다. 그러면 나중에 도메인 컨트롤러를 찾을 수 없다는 오류가 발생하지 않습니다.

핑 DC

핑 dc.domain.com

꼭 필요한 것은 아니지만 변경 사항이 있는 경우 컴퓨터를 다시 시작하여 변경 사항을 적용하세요.

N 시간 동기화 설정

다음으로 도메인 컨트롤러와의 시간 동기화를 구성해야 합니다. 차이가 5분 이상인 경우 Kerberos로부터 리프를 수신할 수 없습니다. 일회성 동기화의 경우 다음 명령을 사용할 수 있습니다.

sudo net 시간 설정 dc

네트워크에 정확한 시간 서버가 있는 경우 해당 서버나 공개 서버를 사용할 수 있습니다.

ntpdate ntp.mobatime.ru

자동 동기화는 ntpd를 사용하여 구성되며 이 데몬은 주기적으로 동기화를 수행합니다. 먼저 설치해야 합니다:

sudo 적성 설치 ntp

이제 시간 서버에 대한 정보를 포함하도록 /etc/ntp.conf 파일을 편집합니다.

# NTP 서버 한두 대(또는 세 대)와 통신해야 합니다.

서버 dc.domain.com

그런 다음 ntpd 데몬을 다시 시작합니다.

sudo /etc/init.d/ntp 재시작

이제 도메인과의 직접적인 상호 작용을 설정할 차례입니다.

Default_realm = DOMAIN.COM

Kdc_timesync = 1

Ccache_type = 4

전달 가능 = true

프록시 가능 = true

V4_instance_resolve = 거짓

V4_name_convert = (

호스트 = (

Rcmd=호스트

ftp = ftp

일반 = (

뭔가 = 뭔가-다른 것

Fcc-mit-ticketflags = true

DOMAIN.COM = (

Kdc = dc

Kdc=dc2

Admin_server = dc

Default_domain = DOMAIN.COM

도메인.com = DOMAIN.COM

도메인.com = DOMAIN.COM

Krb4_convert = 거짓

Krb4_get_tickets = 거짓

물론 domain.com을 도메인으로 변경하고 dc 및 dc2를 도메인 컨트롤러로 변경해야 합니다. 그런데 도메인 컨트롤러 dc.domain.com 및 dc2.domain.com의 전체 이름을 작성해야 할 수도 있습니다. DNS에 검색 도메인이 등록되어 있으므로 이 작업을 수행할 필요가 없습니다.

지불 하십시요 특별한 관심도메인 이름 등록부 - 도메인이 어디에 기록되어 있든 대문자, 반드시 대문자로 작성해야 합니다. 그렇지 않으면 마술적으로아무것도 얻지 못할 수도 있습니다.

그게 다가 아니다 가능한 옵션 Kerberos 설정, 기본 설정만 해당. 그러나 일반적으로 충분합니다.

이제 도메인에 로그인할 수 있는지 확인할 차례입니다. 이렇게 하려면 다음 명령을 실행하세요.

키니트 [이메일 보호됨]

사용자 이름 대신 당연히 기존 도메인 사용자의 이름을 입력해야 합니다.

도메인 이름은 반드시 대문자로 작성해야 합니다!

오류가 발생하지 않으면 모든 것이 올바르게 구성되었으며 도메인에서 Kerberos 티켓을 제공합니다. 그런데 몇 가지 일반적인 실수가 아래에 나열되어 있습니다.

다음 명령을 실행하여 티켓이 수신되었는지 확인할 수 있습니다.

클리스트

다음 명령을 사용하여 모든 티켓을 삭제할 수 있습니다(전혀 필요하지 않음).

kdestroy

아르 자형 일반적인 kinit 오류

kinit(v5): 초기 자격 증명을 가져오는 동안 시계 오차가 너무 큼

이는 컴퓨터의 시간이 도메인 컨트롤러와 동기화되지 않았음을 의미합니다(위 참조).

kinit(v5): 초기 자격 증명을 가져오는 동안 사전 인증에 실패했습니다.

잘못된 비밀번호를 입력하셨습니다.

kinit(v5): 초기 자격 증명을 얻는 동안 KDC 응답이 기대와 일치하지 않았습니다.

가장 이상한 실수입니다. krb5.conf의 영역 이름과 kinit 명령의 도메인이 대문자로 입력되었는지 확인하십시오.

DOMAIN.COM = (

# ...

키니트 [이메일 보호됨]

kinit(v5): 클라이언트 찾을 수 없음초기 자격 증명을 얻는 동안 Kerberos 데이터베이스에서

지정된 사용자가 도메인에 존재하지 않습니다.

N Samba 설정 및 도메인 로그인

도메인에 로그인하려면 /etc/samba/smb.conf 파일에 올바른 설정을 지정해야 합니다. ~에 이 단계에서섹션의 일부 옵션에만 관심이 있어야 합니다. 다음은 값에 대한 설명이 포함된 Samba 구성 파일의 일부 예입니다. 중요한 매개변수:

# 이 두 옵션은 정확히 다음과 같이 작성되어야 합니다. 대문자및 작업그룹이 없습니다.

# 점 뒤의 마지막 섹션 및 영역 - 성명도메인

작업 그룹 = DOMAIN

영역 = DOMAIN.COM

# 이 두 가지 옵션은 AD를 통한 인증을 담당합니다.

보안 = ADS

비밀번호 암호화 = true

# 그냥 중요해요

DNS 프록시 = 아니요

소켓 옵션 = TCP_NODELAY

# Samba가 도메인에서 리더가 되려고 하는 것을 원하지 않거나 실무 그룹,

# 또는 도메인 컨트롤러가 되더라도 항상 이 다섯 가지 옵션을 이 형식으로 작성하세요.

도메인 마스터 = 아니요

로컬 마스터 = 아니요

선호하는 마스터 = 아니요

OS 레벨 = 0

도메인 로그온 = 아니요

# 프린터 지원 비활성화

프린터 로드 = 아니요

프린터 추가 마법사 표시 = 아니요

Printcap 이름 = /dev/null

스풀 비활성화 = 예

smb.conf를 편집한 후 다음 명령을 실행하세요.

테스트팜

구성에 오류가 있는지 확인하고 요약을 제공합니다.

#testparm

/etc/samba/smb.conf에서 smb 구성 파일 로드

서비스 파일 로드가 완료되었습니다.

서버 역할: ROLE_DOMAIN_MEMBER

서비스 정의 덤프를 보려면 Enter를 누르세요.

보시다시피, 우리는 컴퓨터가 도메인의 구성원이 되도록 올바른 매개변수를 설정했습니다. 이제 도메인에 직접 로그인을 시도해 볼 차례입니다. 이렇게 하려면 다음 명령을 입력하십시오.

순 광고 가입 -U 사용자 이름 -D DOMAIN

성공하면 다음과 비슷한 내용이 표시됩니다.

# 순 광고 가입 -U 사용자 이름 -D DOMAIN

사용자 이름의 비밀번호를 입력하세요:

짧은 도메인 이름 사용 -- DOMAIN

"domain.com" 영역에 "SMBSRV01"에 가입했습니다.

그리고 사용된 net 명령 옵션

사용자 이름%비밀번호: 필수 매개변수, 사용자 이름 대신 사용자 이름을 도메인 관리자 권한으로 대체하고 비밀번호를 지정해야 합니다.

D DOMAIN: DOMAIN - 도메인 자체는 도메인을 지정할 필요가 없지만 항상 지정하는 것이 더 좋습니다. 더 나빠지지는 않습니다.

S win_domain_controller : win_domain_controller를 지정하지 않을 수도 있지만 서버가 자동으로 도메인 컨트롤러를 찾지 못하는 경우가 있습니다.

createcomputer="OU/OU/..." : AD에서는 OU(Organizational Unit)를 자주 사용하는데, 도메인 루트에 OU=Office가 있고, 그 안에 OU=Cabinet이 있으므로 사용하려는 곳에 즉시 추가할 수 있습니다. 필요한 경우 다음과 같이 지정할 수 있습니다: sudo net Ads Join -U 사용자 이름 createcomputer="Office/Cabinet".

더 이상 메시지가 없으면 모든 것이 정상입니다. 다른 도메인 구성원의 이름으로 컴퓨터를 ping하여 모든 항목이 도메인에 제대로 등록되어 있는지 확인하세요.

다음 명령을 입력할 수도 있습니다.

순 광고 테스트 참여

모든 것이 양호하면 다음을 볼 수 있습니다.

#net 광고 테스트 참여

가입은 OK

그러나 때로는 도메인 가입에 대한 메시지 후에 3)과 같은 오류가 나타납니다.

DNS 업데이트에 실패했습니다!

이는 그다지 좋지 않으며, 이 경우 DNS 다시 설정에 대한 섹션을 조금 더 읽고 무엇이 잘못되었는지 이해하는 것이 좋습니다. 그런 다음 도메인에서 컴퓨터를 제거하고 다시 입력해야 합니다. 모든 것을 올바르게 구성했다고 확신하지만 DNS가 여전히 업데이트되지 않은 경우 컴퓨터 항목을 DNS 서버에 수동으로 추가하면 모든 것이 작동합니다. 물론, 다른 오류가 없고 도메인에 성공적으로 로그인한 경우입니다. 그러나 DNS가 자동으로 업데이트되지 않는 이유를 파악하는 것이 좋습니다. 이는 귀하의 컴퓨터뿐만 아니라 다음과도 관련될 수 있습니다. 잘못된 설정기원 후.

DNS가 업데이트되지 않는 이유를 확인하기 전에 도메인에 진입한 후 컴퓨터를 다시 시작하는 것을 잊지 마세요! 이것이 문제를 해결할 가능성이 높습니다.

모든 것이 오류 없이 진행되었다면 축하합니다. 도메인에 성공적으로 로그인했습니다! AD를 보고 직접 확인할 수 있습니다. 도메인의 리소스를 볼 수 있는지 확인하는 것도 좋은 방법입니다. 이렇게 하려면 smbclient를 설치하십시오.

sudo 적성 설치 smbclient

이제 도메인 컴퓨터의 리소스를 볼 수 있습니다. 하지만 이를 위해서는 Kerberos 티켓이 필요합니다. 삭제한 경우 kinit를 통해 다시 가져옵니다(위 참조). 워크스테이션 컴퓨터가 네트워크에 어떤 리소스를 제공하는지 살펴보겠습니다.

smbclient -k -L 워크스테이션

이 컴퓨터의 공유 리소스 목록이 표시됩니다.

윈바인드 설정

예를 들어 액세스 제어를 사용하여 SMB 공유를 구성하는 등 어떤 방식으로든 도메인 사용자와 작업해야 하는 경우 Samba 자체 외에도 통신에 사용되는 특수 데몬인 Winbind도 필요합니다. 로컬 시스템사용자 관리 및 리눅스 그룹서버와 함께 액티브 디렉토리. 간단히 말해서, Ubuntu 컴퓨터에서 도메인 사용자를 보려면 Winbind가 필요합니다.

Winbind를 사용하면 모든 사용자와 모든 AD 그룹을 리눅스 시스템, 주어진 범위의 ID를 할당합니다. 이렇게 하면 도메인 사용자를 컴퓨터의 폴더 및 파일 소유자로 할당하고 사용자 및 그룹과 관련된 기타 작업을 수행할 수 있습니다.

Winbind를 구성하려면 동일한 파일 /etc/samba/smb.conf가 사용됩니다. 섹션에 다음 줄을 추가합니다.

# 도메인 사용자와 일치하는 옵션 가상 사용자 Winbind를 통해 시스템에서.

# 가상 사용자 및 그룹의 ID 범위.

Idmap uid = 10000 - 40000

Idmap gid = 10000 - 40000

# 이 옵션은 비활성화되어서는 안 됩니다.

Winbind 열거형 그룹 = 예

Winbind 열거형 사용자 = 예

# 사용자 이름에 기본 도메인을 사용합니다. 이 옵션이 없으면 사용자 및 그룹 이름이

#은 도메인과 함께 사용됩니다. 사용자 이름 대신 - DOMAIN\username.

# 이것이 원하는 것일 수도 있지만 일반적으로 이 옵션을 활성화하는 것이 더 쉽습니다.

Windbind는 기본 도메인을 사용합니다 = 예

# 도메인 사용자가 명령줄을 사용하도록 허용하려면 다음을 수행합니다.

# 추가하다 다음 줄그렇지 않으면 /bin/false가 쉘로 호출됩니다.

템플릿 쉘 = /bin/bash

# 을 위한 자동 업데이트 pam_winbind.so 모듈이 포함된 Kerberos 티켓에 다음 행을 추가해야 합니다.

Windbind 새로 고침 티켓 = 예

옵션:

idmap uid = 10000 - 40000

idmap gid = 10000 - 40000

새 버전의 Samba에서는 이미 오래되었으며 testparm을 사용하여 Samba 구성을 확인할 때 경고가 표시됩니다.

경고: "idmap uid" 옵션은 더 이상 사용되지 않습니다.

경고: "idmap gid" 옵션은 더 이상 사용되지 않습니다.

경고를 제거하려면 다음 줄을 새 줄로 바꿔야 합니다.

idmap 구성 * : 범위 = 10000-20000

idmap 구성 * : 백엔드 = tdb

이제 다음 순서로 Winbind 및 Samba 데몬을 다시 시작합니다.

sudo /etc/init.d/winbind 중지

sudo smbd 재시작

sudo /etc/init.d/winbind 시작

발사하자

sudo 테스트팜

다음과 같은 경우 오류나 경고가 있는지 살펴보겠습니다.

"rlimit_max: rlimit_max(1024)가 최소 Windows 제한(16384)보다 낮습니다."

다음과 같이 재부팅하지 않고도 문제를 해결할 수 있습니다.

ulimit -n 16384

재부팅 후 저장하려면 /etc/security/limits.conf 파일을 편집하세요.

# 파일 끝에 다음 줄을 추가합니다.

* - 파일 16384 없음

루트 - nofile 16384

다시 시작한 후 Winbind가 설치되어 있는지 확인하십시오. 신뢰관계 AD 명령으로:

# wbinfo -t

RPC 호출을 통해 도메인 DCN에 대한 신뢰 비밀을 확인하는 데 성공했습니다.

또한 Winbind는 명령 4)를 사용하여 AD의 사용자 및 그룹을 확인했습니다.

wbinfo -u

wbinfo -g

이 두 명령은 각각 도메인의 사용자와 그룹을 나열해야 합니다. smb.conf의 "winbind use default domain" 매개 변수에 지정한 값에 따라 DOMAIN\ 접두사가 있거나 없습니다.

따라서 Winbind는 작동하지만 아직 시스템에 통합되지 않았습니다.

사용자 및 그룹의 소스로 Winbind 추가

Ubuntu가 도메인 사용자와 투명하게 작동하려면, 특히 도메인 사용자를 폴더 및 파일의 소유자로 설정할 수 있도록 Ubuntu에게 Winbind를 다음과 같이 사용하도록 지시해야 합니다. 추가 소스사용자 및 그룹에 대한 정보.

이렇게 하려면 /etc/nsswitch.conf 파일에서 두 줄을 변경합니다.

비밀번호:호환

그룹: 호환

끝에 winbind를 추가합니다.

passwd: winbind 호환

그룹: compat winbind

파일: dns mdns4_minimal mdns4

우분투 서버 14.04에서 /etc/nsswitch.conf 파일에 "files: dns mdns4_minimal mdns4" 줄이 포함되어 있지 않았습니다. 대신 "hosts: files mdns4_minimal dns Wins"였습니다. 나중에 "hosts: dns mdns4_minimal mdns4 files"로 변환했습니다. 모든 것이 효과가 있었던 것

이제 Ubuntu가 다음을 실행하여 Winbind에 사용자 및 그룹 정보를 요청하는지 확인합니다.

getent 비밀번호

getent 그룹

첫 번째 명령은 /etc/passwd 파일의 전체 내용, 즉 로컬 사용자, smb.conf에 지정한 범위의 ID를 가진 도메인 사용자. 두 번째는 그룹에 대해 동일한 작업을 수행해야 합니다.

이제 모든 도메인 사용자를 선택하여 예를 들어 파일 소유자로 만들 수 있습니다.

도메인 사용자를 통한 Ubuntu에서의 인증

모든 도메인 사용자가 실제로 시스템의 완전한 사용자가 되었다는 사실에도 불구하고(이전 섹션의 마지막 두 명령을 실행하여 확인할 수 있음) 이들 중 하나로 시스템에 로그인하는 것은 여전히 ​​불가능합니다. Ubuntu를 실행하는 컴퓨터에서 도메인 사용자에게 권한을 부여하는 기능을 활성화하려면 Winbind와 작동하도록 PAM을 구성해야 합니다.

Ubuntu 10.04 이상의 경우 /etc/pam.d/common-session 파일에 한 줄만 추가하세요. PAM은 이미 인증 작업을 훌륭하게 수행하고 있습니다.

Ubuntu 13.10의 경우 수동 로그인 입력 필드를 표시하려면 /etc/lightdm/lightdm.conf/ 폴더의 파일에 아래 줄을 추가해야 합니다.

인사-쇼-수동-로그인=true

Ubuntu 9.10 이하의 경우 여러 파일을 편집해야 합니다(그러나 10.04에서는 아무도 이 방법을 사용하는 것을 금지하지 않습니다. 이 방법도 작동합니다).

파일의 줄 순서가 중요합니다!

/etc/pam.d/common-auth

인증이 필요합니다 pam_env.so

인증이 충분합니다. pam_unix.so likeauth nullok try_first_pass

충분한 인증 pam_winbind.so use_first_pass krb5_auth krb5_ccache_type=FILE

인증이 필요합니다 pam_deny.so

/etc/pam.d/common-account

계정이 충분함 pam_winbind.so

계정이 필요합니다 pam_unix.so

/etc/pam.d/common-session

세션 선택 사항 pam_mkhomedir.so skel=/etc/skel/umask=0077

세션 선택 사항 pam_ck_connector.so nox11

세션이 필요합니다 pam_limits.so

세션이 필요합니다 pam_env.so

세션이 필요합니다 pam_unix.so

/etc/pam.d/common-password

비밀번호가 충분합니다. pam_unix.so try_first_pass use_authtok nullok sha512 섀도우

비밀번호가 충분함 pam_winbind.so

비밀번호가 필요합니다 pam_deny.so

마지막으로 시스템 부팅 시 Winbind 실행을 다른 모든 서비스 이후로 이동해야 합니다(기본적으로 인덱스 20에서 시작함). 이렇게 하려면 터미널에서 다음 명령을 실행하세요.

sudo bash -c "2 3 4 5의 경우; mv /etc/rc$i.d/S20winbind /etc/rc$i.d/S99winbind; 완료"

이는 각 수준(예제에서는 4)에 대해 명령을 실행하는 것과 동일합니다.

mv /etc/rc4.d/S20winbind /etc/rc4.d/S99winbind

경우에 따라 winbind의 실행 수준이 다를 수 있습니다(예: S02winbind). 따라서 먼저 “ls /etc/rc(2,3,4,5).d/ | grep winbind"(따옴표 제외).

완료, 모든 설정이 완료되었습니다. 재부팅하고 로그인을 시도하십시오 계정도메인 사용자.

유지 관리, 정전, 노트북을 집에 가져와서 작업하려는 경우 등 다양한 이유로 도메인 컨트롤러를 사용할 수 없는 경우 상황이 자주 발생합니다. 이 경우 도메인 사용자 계정을 캐시하도록 Winbind를 구성할 수 있습니다. 이렇게 하려면 다음을 수행해야 합니다. 파일의 /etc/samba/smb.conf 섹션에 다음 줄을 추가합니다.

Windbind 오프라인 로그인 = 예

# 계정 캐싱 기간, 기본값은 300초

Winbind 캐시 시간 = 300

# 선택적 설정, 그러나 지루한 일시 중지를 제거하고 도메인 컨트롤러 dc를 지정합니다.

# IP를 지정할 수도 있지만 이는 잘못된 형식입니다.

비밀번호 서버 = dc

일반적으로 이것으로 충분합니다. 오류가 발생하면 파일을 생성해야 합니다. /etc/security/pam_winbind.conf다음 내용으로 5):

주목! 아래 팁을 사용하면 완전히 경험할 수 있습니다. 무작위 오류"인증 실패"! 그러므로 당신이 하는 모든 일은 당신 자신의 위험을 감수하고 수행하는 것입니다!

# pam_winbind 구성 파일

# /etc/security/pam_winbind.conf

# 디버깅을 켠다

디버그 = 아니요

# 가능하다면 캐시된 로그인을 요청합니다

# (smb.conf에서 "winbind 오프라인 로그온 = yes" 필요)

Cached_login = 예

# Kerberos를 사용하여 인증

Krb5_auth = 예

# Kerberos를 사용할 때 "FILE" krb5 자격 증명 캐시 유형을 요청합니다.

# (krb5 인증만 수행하려면 비워두세요. 하지만 가지고 있지 않다티켓

#후에)

Krb5_ccache_type = 파일

# 성공적인 인증을 하나의 SID 멤버십에 따라 결정합니다.

# (이름도 가능)

;require_membership_of =

침묵=그렇다

이 경우 /etc/pam.d/gnome-screensaver 파일은 다음 형식을 취합니다.

충분한 인증 pam_unix.so nullok_secure

인증이 필요합니다 pam_deny.so

또한 /etc/pam.d/common-auth 파일도 변경됩니다.

인증 선택사항 pam_group.so

충분한 인증 pam_unix.so nullok_secure use_first_pass

충분한 인증 pam_winbind.so use_first_pass

인증이 필요합니다 pam_deny.so



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: