.\" -*- coding: UTF-8 -*-
.if \n(.g .ds T< \\FC
.if \n(.g .ds T> \\F[\n[.fam]]
.de URL
\\$2 \(la\\$1\(ra\\$3
..
.if \n(.g .mso www.tmac
.TH lxc-attach 1 2025-08-26 "" ""
.SH NAME
lxc-attach \- 실행 중인 컨테이너 내에 프로세스를 실행 
.SH SYNOPSIS
'nh
.fi
.ad l
\fBlxc-attach\fR \kx
.if (\nx>(\n(.l/2)) .nr x (\n(.l/5)
'in \n(.iu+\nxu
{-n, --name \fIname\fR} [-f, --rcfile \fIconfig_file\fR] [-a, --arch \fIarch\fR] [-e, --elevated-privileges \fIprivileges\fR] [-s, --namespaces \fInamespaces\fR] [-R, --remount-sys-proc] [--keep-env] [--clear-env] [-L, --pty-log \fIfile\fR] [-v, --set-var \fIvariable\fR] [--keep-var \fIvariable\fR] [-u, --uid \fIuid\fR] [-g, --gid \fIgid\fR] [-- \fIcommand\fR]
'in \n(.iu-\nxu
.ad b
'hy
.SH 설명
\fBlxc-attach\fR는 \fIname\fR으로 지정한 컨테이너 내에 \fIcommand\fR를 실행한다.
해당 컨테이너는 실행중이어야 한다.
.PP
만약 \fIcommand\fR가 지정되지 않았다면, \fBlxc-attach\fR가 현재 실행 중인 쉘이 컨테이너 안에도 있는지 검사하고 이를 실행한다.
만약 컨테이너 안에 사용자가 존재하지 않거나, nsswitch가 제대로 동작하지 않는 경우에는 이 명령이 실패하게 된다.
.PP
이전 버전의 \fBlxc-attach\fR는 단순히 컨테이너의 특정 네임스페이스 내에서 쉘이나 명령어를 pseudo 터미널 할당 없이 실행하였다.
이는 다른 특권 수준을 갖는 사용자 영역 컨텍스트 간의 전환후 TIOCSTI \fBioctl\fR를 호출하여 입력을 가로챌 수 있는 취약점이 있다.
새로운 버전의 \fBlxc-attach\fR는 쉘이나 명령어를 실행하기 전, 호스트에서 pseudo 터미널 마스터/슬레이브 쌍을 할당하고, 터미널을 가리키고 있던 표준 입출력 파일 디스크립터들을 pseudo 터미널의 슬레이브로 연결한다.
터미널을 가리키고 있던 표준 입출력 파일 디스크립터가 아예 없었다면, \fBlxc-attach\fR는 pseudo 터미널 할당을 시도하지 않음에 주의해야 한다. 단순히 컨테이너 네임스페이스 내부에서 쉘이나 지정한 명령어를 실행할 뿐이다.
.SH 옵션
.TP 
\*(T<\fB\-f, \-\-rcfile \fR\*(T>\fIconfig_file\fR 
컨테이너의 가상화 및 고립 기능들을 설정할 파일을 지정한다.

이전에 만들어졌던 컨테이너에 설정 파일이 이미 있더라도, 이 옵션이 지정되어 있다면 해당 파일을 사용한다.
.TP 
\*(T<\fB\-a, \-\-arch \fR\*(T>\fIarch\fR 
명령어를 실행하는 컨테이너의 아키텍처를 지정한다.
이 옵션은 컨테이너의 설정파일에서 지정한 \*(T<\fBlxc.arch\fR\*(T> 옵션과 같은 것만 사용할 수 있다.
\fB\*(T<\fIlxc.conf\fR\*(T>\fR(5)를 참조 바란다. 기본값은 실행 중인 컨테이너의 아키텍처이다.
.TP 
\*(T<\fB\-e, \-\-elevated\-privileges \fR\*(T>\fIprivileges\fR 
컨테이너 내부에서 \fIcommand\fR를 실행할 때 privilege를 제거하지 않는다.
만약 이 옵션이 지정되었다면, 새로운 프로세스는 컨테이너의 cgroup에 추가되지 \fI않는다\fR. 그리고 실행 전 capability도 제거하지 않는다.

만약 모든 privilege를 얻고 싶지 않을 경우에는 \fICGROUP|LSM\fR와 같이 파이프(|)로 구분된 리스트를 사용할 수 있다.
허용되는 값은 \fICGROUP\fR、\fICAP\fR、\fILSM\fR이다. 각각 cgroup, capability, MAC label을 나타낸다.
(파이프 기호는 \fICGROUP\e|LSM\fR처럼 \e로 처리를 해주거나, \fI"CGROUP|LSM"\fR처럼 따옴표를 붙여야 한다.)

\fI경고 :\fR
만약 명령어가 attach된 메인프로세스가 종료된 후에, 실행 상태로 남아있는 서브프로세스를 시작하려고 한다면, 컨테이너 내부로 privilege 누수가 발생할 수 있다.
컨테이너 내에서 데몬을 시작(또는 재시작)하는 것은 문제가 될 수 있다. 특히 만약 데몬이 많은 서브프로세스 를 실행하는 경우라면,
예를 들어 \fBcron\fR와 \fBsshd\fR와 같은 경우는 문제가 될 수 있다.
\fI충분한 주의를 기울여서 사용하여야 한다.\fR
.TP 
\*(T<\fB\-s, \-\-namespaces \fR\*(T>\fInamespaces\fR 
컨테이너의 어떤 네임스페이스와 연결할지 지정한다. \fINETWORK|IPC\fR와 같이 파이프(|)로 구분된 리스트를 사용할 수 있다.
허용되는 값은 \fIMOUNT\fR, \fIPID\fR, \fIUTSNAME\fR, \fIIPC\fR, \fIUSER \fR, \fINETWORK\fR이다.
이를 사용하여, 컨테이너의 네트워크 네임스페이스를 사용하면서도 다른 네임스페이스는 호스트의 것을 그대로 사용하는 등의 조작이 가능하다.
(파이프 기호는 \fIMOUNT\e|PID\fR처럼 \e로 처리를 해주거나, \fI"MOUNT|PID"\fR처럼 따옴표를 붙여야 한다.)

\fI중요 :\fR 이 옵션은 \*(T<\fB\-e\fR\*(T> 옵션을 포함하고 있다.
.TP 
\*(T<\fB\-R, \-\-remount\-sys\-proc\fR\*(T> 
\*(T<\fB\-s\fR\*(T>를 사용하여 마운트 네임스페이스를 포함하지 않았을 때, 이 플래그는 \fBlxc-attach\fR가 \fI/proc\fR와 \fI/sys\fR를 remount 하게 만든다.
이는 현재와 다른 네임스페이스 컨텍스트를 반영시키기 위함이다.

좀더 자세한 설명은 \fI주의\fR섹션을 참고하면 된다.

만약 마운트 네임스페이스에 연결하려고 한다면, 이 옵션은 무시된다.
.TP 
\*(T<\fB\-\-keep\-env\fR\*(T> 
현재의 환경변수를 실행할 프로그램에도 그대로 적용한다. 이것은 현재 기본 동작이지만 (버전 0.9에서), 향후에 충분히 바뀔 수도 있다.
왜냐하면, 이것은 컨테이너에게 바람직하지 않은 정보를 넘겨줄 수 있는 위험성이 있기 때문이다. 따라서 이 기능에 의존하고 있다면, 향후에도 이를 보장할 수 있도록 이 옵션을 사용하는 것이 좋다.
또한 현재 환경 변수와 더불어, container=lxc도 설정된다.
.TP 
\*(T<\fB\-\-clear\-env\fR\*(T> 
프로그램을 실행하기 전에 모든 환경변수를 지운다.
이를 통해 바람직하지 않은 환경변수 누출을 막을 수 있다. container=lxc 만이 프로그램이 실행되기 전에 설정되는 유일한 환경변수이다.
.TP 
\*(T<\fB\-L, \-\-pty\-log \fR\*(T>\fIfile\fR 
\fBlxc-attach\fR의 출력을 기록할 파일을 지정한다.

\fI중요:\fR 표준 입출력 파일 디스크립터가 pty를 참조하지 않으면, 기록되지 않는다.
.TP 
\*(T<\fB\-v, \-\-set\-var \fR\*(T>\fIvariable\fR 
컨테이너 내에서 실행되는 프로그램이 볼 수 있는 환경변수를 추가한다.
이는 "VAR=VALUE" 형태로 지정되며, 여러 번 지정할 수 있다.
.TP 
\*(T<\fB\-\-keep\-var \fR\*(T>\fIvariable\fR 
\fI\e-\e-clear-env\fR와 함께 사용되며, 지정한 환경변수를 지우지 않고 그대로 유지한다. 여러 번 지정할 수 있다.
.TP 
\*(T<\fB\-u, \-\-uid \fR\*(T>\fIuid\fR 
지정된 사용자 ID \fIuid\fR로 \fIcommand\fR를
container 내부에 실행한다.
.TP 
\*(T<\fB\-\-g, \-\-gid \fR\*(T>\fIgid\fR 
지정된 그룹 ID \fIgid\fR로 \fIcommand\fR를
container 내부에 실행한다.
.SH "공통 옵션"
이 옵션들은 대부분의 lxc 명령어들에서 공통으로 쓰인다.
.TP 
\*(T<\fB\-?, \-h, \-\-help\fR\*(T>
사용법을 기존 출력하는 것보다 길게 출력한다.
.TP 
\*(T<\fB\-\-usage\fR\*(T>
사용법을 표시한다.
.TP 
\*(T<\fB\-q, \-\-quiet\fR\*(T>
결과를 표시하지 않는다.
.TP 
\*(T<\fB\-P, \-\-lxcpath=\fR\*(T>\fIPATH\fR
컨테이너 경로를 직접 지정한다. 기본값은 /var/lib/lxc이다.
.TP 
\*(T<\fB\-o, \-\-logfile=\fR\*(T>\fIFILE\fR
로그의 경로를 \fIFILE\fR로 지정한다. 기본값은 로그를 출력하지 않는 것이다.
.TP 
\*(T<\fB\-l, \-\-logpriority=\fR\*(T>\fILEVEL\fR
로그 수준을 \fILEVEL\fR로 지정한다. 기본값은 \*(T<ERROR\*(T>이다. 사용 가능한 값 :
\*(T<FATAL\*(T>, \*(T<ALERT\*(T>,
\*(T<CRIT\*(T>,
\*(T<WARN\*(T>, \*(T<ERROR\*(T>,
\*(T<NOTICE\*(T>, \*(T<INFO\*(T>,
\*(T<DEBUG\*(T>, \*(T<TRACE\*(T>.

이 옵션은 로그 파일에만 적용된다는 사실을 주의해야 한다. stderr로 출력되는 ERROR 로그에는 영향을 끼치지 않는다.
.TP 
\*(T<\fB\-n, \-\-name=\fR\*(T>\fINAME\fR
컨테이너 식별자로 \fINAME\fR을 사용한다. 컨테이너 식별자의 형식은 알파벳-숫자 문자열이다.
.TP 
\*(T<\fB\-\-rcfile=\fR\*(T>\fIFILE\fR
컨테이너의 가상화 및 고립 기능들을 설정할 파일을 지정한다.

이전에 만들어졌던 컨테이너에 설정 파일이 이미 있더라도, 이 옵션이 지정되어 있다면 해당 파일을 사용한다.
.TP 
\*(T<\fB\-\-version\fR\*(T>
버전 정보를 표시한다.
.SH 예제
존재하는 컨테이너의 내부에 새로운 쉘을 실행한다.

.nf
\*(T<
          lxc\-attach \-n container
        \*(T>
.fi
.PP
실행중인 Debian 컨테이너의 cron 서비스를 재시작한다.

.nf
\*(T<
          lxc\-attach \-n container \-\- /etc/init.d/cron restart
        \*(T>
.fi
.PP
NET_ADMIN capability없이 실행중인 컨테이너의 네트워크 링크 eth1을 비활성화하였다. \*(T<\fB\-e\fR\*(T> 옵션을 사용하여 capability를 높였고, \fBip\fR 툴이 설치되어있다고 가정하였다.

.nf
\*(T<
          lxc\-attach \-n container \-e \-\- /sbin/ip link delete eth1
        \*(T>
.fi
.SH 호환성
(pid와 마운트 네임스페이스를 포함한) attach가 동작하기 위해서는 커널의 버전이 3.8 이상이거나 패치가 적용된 커널이어야 한다. 좀더 자세히 보려면 lxc 웹사이트를 참고하면 된다. \fBlxc-attach\fR는 패치되지 않은 커널 버전 3.7 이하면 실패된다.
.PP
그러나 \*(T<\fB\-s\fR\*(T>를 사용하여 \fINETWORK\fR, \fIIPC\fR, \fIUTSNAME\fR 네임스페이스 들만 지정한다면, 패치되지 않은 커널 3.0 이상에서도 성공적으로 동작한다.
.PP
사용자 네임스페이스와 연결되기 위해서는 커널 버전이 3.8 이상이어야 하고 사용자 네임스페이스가 활성화되어야 한다.
.SH 주의
리눅스의 \fI/proc\fR와 \fI/sys\fR 파일시스템은 네임스페이스의해 영향받는 몇가지 정보들을 포함하고 있다. 예를 들어 \fI/proc\fR의 프로세스 id로 된 폴더들이나 \fI/sys/class/net\fR의 네트워크 인터페이스 정보 등이다.
pseudo 파일시스템을 마운트하는 프로세스의 네임스페이스가 여기에 어떤 정보를 표시할지 결정하는 것이지, \fI/proc\fR 또는 \fI/sys\fR에 접근하는 프로세스의 네임스페이스가 결정하는 것은 \fI아니다.\fR
.PP
\*(T<\fB\-s\fR\*(T> 를 사용하여 컨테이너의 pid 네임스페이스에만 attach 시키고 마운트 네임스페이스(컨테이너의 \fI/proc\fR는 포함하고, 호스트의 것은 포함하지 않는)는 attach 시키지 않는 경우, \*(T<\fB/proc\fR\*(T>의 내용은 컨테이너의 것이 아닌 호스트의 것이 된다.
네트워크 네임스페이스만을 연결하고 \fI/sys/class/net\fR의 내용을 읽을 때도 같은 현상이 있다.
.PP
이러한 문제를 해결하기 위해, \*(T<\fB\-R\fR\*(T> 옵션이 제공된다. 해당 옵션은 attach되는 프로세스의 네트워크/pid 네임스페이스를 반영하기 위해 \fI/proc\fR와 \fI/sys\fR를 다시 마운트한다.
호스트의 실제 파일시스템에 방해가 되지 않기 위해 마운트 네임스페이스는 공유되지 않는다(\fBlxc-unshare\fR의 동작과 비슷). \fI/proc\fR와 \fI/sys\fR 파일시스템을 제외하고 호스트 마운트 네임스페이스와 동일한 새로운 마운트 네임스페이스가 주어지게 된다.
.PP
이전 버전의 \fBlxc-attach\fR는 몇몇 중요한 서브시스템에 쓰기가 가능한 cgroup 내에 없더라도, 사용자가 컨테이너의 네임스페이스에 연결할 수 있는 버그가 있었다.
새로운 버전의 \fBlxc-attach\fR는 현재 사용자가 몇몇 중요한 서브시스템에 쓰기 권한이 있는 cgroup에 속하는지 여부를 검사한다. 그러므로 \fBlxc-attach\fR는 사용자에 따라 실패하는 경우도 있다. (예를 들어, 로그인 시 비특권 사용자가 중요 서브시스템에 쓰기가 가능한 cgroup에 위치하지 않은 경우) 하지만 이러한 동작은 정확한 것이고 더 안전한 것이다.
.SH 보안
\*(T<\fB\-e\fR\*(T>와 \*(T<\fB\-s\fR\*(T> 옵션을 사용할때는 주의해야 한다. 잘못 사용하게 하면 컨테이너들 간의 고립(isolation)을 깨트릴 수 있다.
.SH 참조
\fBlxc\fR(7),
\fBlxc-create\fR(1),
\fBlxc-copy\fR(1),
\fBlxc-destroy\fR(1),
\fBlxc-start\fR(1),
\fBlxc-stop\fR(1),
\fBlxc-execute\fR(1),
\fBlxc-console\fR(1),
\fBlxc-monitor\fR(1),
\fBlxc-wait\fR(1),
\fBlxc-cgroup\fR(1),
\fBlxc-ls\fR(1),
\fBlxc-info\fR(1),
\fBlxc-freeze\fR(1),
\fBlxc-unfreeze\fR(1),
\fBlxc-attach\fR(1),
\fBlxc.conf\fR(5)
