저는 Ubuntu 14.04에서 작업 중이며 컴파일된 C++ 애플리케이션을 가지고 있습니다. "program"이라는 이름의 실행 파일을 얻습니다. 문제는 이 프로그램이 opencv와 소켓을 사용한다는 것입니다. 따라서 터미널에서 다음과 같이 실행하려고 하면:
./program
다음 오류가 발생합니다.
listener: socket: Operation not permitted
setsockopt: Bad file descriptor
소켓을 사용하고 있고 애플리케이션을 루트로 실행해야 하기 때문에 이 오류가 발생했습니다. 그래서 다음을 입력했습니다.
sudo ./program
이를 위해서는 내 비밀번호와 프로그램의 작업 속성이 필요합니다.
문제는 Ubuntu를 부팅할 때 이 "프로그램"이 자동으로 실행되도록 하고 싶지만 작동하지 않는다는 것입니다. 다른 응용 프로그램이 있는데 이름은 "카메라"입니다. 소켓 없이 opencv만 사용하므로 루트로 실행할 필요가 없습니다. 그래서 이 앱을 Ubuntu의 시작 앱에 넣었더니 "Camera" 앱이 문제 없이 처음부터 바로 시작되었습니다.
그렇다면 Ubuntu에서 소켓을 사용하는 애플리케이션을 자동으로 시작하는 방법은 무엇입니까?
나는 이것을 시도한다:
sudo chown root:root ./program
sudo chmod a+s ./program
그런데 내 프로그램은 비디오를 사용하기 때문에 비디오를 보려고 하면 프로그램이 중지됩니다. 내 프로그램에는 보안 허점이 없기 때문에 버퍼 오버플로 취약점 등에 취약하기 때문입니다.
기본적으로 문제 없이 프로그램을 시작하는 방법만 알면 됩니다.
답변1
RecvRawEth.c
위 댓글에 게시한 파일 이름 으로 볼 때 원시 소켓( SOCK_RAW
)을 사용하려고 하는 것으로 추측됩니다. 이것언제나원시 소켓에는 다음과 같은 다른 보안 메커니즘을 우회할 수 있는 가능성이 있으므로 프로그램을 루트로 실행해야 합니다.권한 있는 포트.
이 앱을 다시 생각해 보아야 합니다.매우원시 소켓을 합법적으로 요구하는 프로그램은 거의 없습니다. 거의 항상 더 나은 방법이 있습니다.
고려해야 할 적어도 두 가지 추가 문제가 있는데, 이는 실제로부정한 음식Stack Exchange 유형 사이트에서는 어쨌든 해결하겠습니다.
설정값
root
실제로 누가 시작했는지에 상관없이 원시 소켓 을 실행 중인 것으로 표시하여
root
원시 소켓에 대한 제한 사항을 해결 하려고 합니다. 그렇게 하면 하나 이상의 보안 취약점이 발생할 수 있습니다. 저를 믿으십시오. 수십 년간의 Unix 역사를 보면 복잡한 setuidroot
프로그램에는 악용 가능한 문제가 있을 가능성이 높습니다. 이를 모두 찾아서 제거하는 데는 수년이 걸릴 수 있습니다.절대적으로 원시 소켓을 사용해야 하고 따라서 프로그램의 일부 요소를 루트로 실행해야 하는 경우 제한된 범위로 작성하는 것이 좋습니다.악마. 즉, 프로그램을 가능한 한 작게 만들고 이를 수행하는 데 필요한 최소한의 작업만 수행하고
root
결과 정보를 일반 권한으로 실행되는 프로그램으로 내보내는 데 필요한 모든 작업을 수행합니다.신병
데몬을 생성하는 경우 시스템 시작 시 실행되도록 설정하는 것은 간단합니다. 데몬을 생성하는 방법을 보여주는 좋은 튜토리얼에서 이 내용을 다룰 것입니다. 우분투에서는 이것이 처리를 의미한다고 믿습니다.
systemd
.GUI 부분은 다음과 같습니다.세션 시작에 이것을 추가하십시오.