Dev Blog

스크립트 & 소스코드 공유

실무에서 유용하게 쓰는 스크립트와 코드 조각을 블로그 게시판으로 저장하고 공유합니다.

총 110건의 글

frpc 내부망 터널 자동 실행 스크립트

frpc 내부망 터널 프로세스가 꺼져 있을 때 자동으로 다시 실행해주는 셸 스크립트다. ps -fe | grep frpc로 프로세스 실행 여부를 확인하고, 실행 중이 아니면 nohup으로 frpc를 백그라운드에서 시작하며 로그를 /var/log/frp.log에 남긴다. 반복 실행이 이미 진행 중이면 메시지를 출력한다.

ps -fe|grep frpc |grep -v grep
if [ $? -ne 0 ] ;
then
echo "启动内网穿透....."
nohup /www/wwwroot/frpc/frpc -c /www/wwwroot/frpc/frpc.ini >/var/log/frp.log 2>&1 &
else
echo "内网穿透运行中....."
fi

[개발 개념] Ubuntu에서 yum 패키지를 찾을 수 없음 오류 해결

Ubuntu 20.04에서 yum을 설치하려 할 때 패키지를 찾을 수 없다는 오류(E: 패키지 yum을 찾을 수 없습니다)가 발생하는 원인과 해결 방법이다. /etc/apt/sources.list에 우분투 패키지 저장소 주소를 추가하고 apt-get update를 실행한 뒤, 관련 패키지들을 순서대로 설치하면 yum을 정상적으로 사용할 수 있다.

제시해주신 Ubuntu 20.04 환경에서 yum 설치 오류를 해결하고 성공적으로 설치하는 과정을 마크다운 형식으로 깔끔하게 정리해 드립니다.


Ubuntu 20.04에서 Yum 설치 오류 해결 및 설치 가이드

Ubuntu 환경에서 yum을 설치하려 할 때, 패키지 저장소 주소가 누락되어 있거나 의존성 패키지가 부족하여 설치가 실패하는 경우가 있습니다. 아래 단계에 따라 설정을 변경하면 문제를 해결할 수 있습니다.

1. APT 소스 리스트 수정

Ubuntu 패키지를 다운로드할 수 있는 공식 저장소 주소를 추가해야 합니다. /etc/apt/sources.list 파일을 열어 아래 내용을 추가합니다.

수정할 파일: /etc/apt/sources.list
추가할 내용:

deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse

내용을 추가한 후, 아래 명령어를 입력하여 패키지 리스트를 업데이트합니다.

sudo apt-get update

2. 필수 의존성 패키지 설치

소스 리스트를 업데이트한 후에도 오류가 발생한다면, yum 실행에 필요한 Python 관련 의존성 패키지들을 수동으로 설치해 주어야 합니다. 터미널에 다음 명령어들을 순서대로 입력하세요.

sudo apt install python-lzma 
sudo apt install python-sqlitecachec 
sudo apt install python-pycurl 
sudo apt install python-urlgrabber

3. Yum 최종 설치

모든 의존성 패키지 설치가 완료되었다면, 이제 다시 yum 설치를 진행합니다.

sudo apt install yum

설치가 완료되면 Ubuntu 환경에서도 yum 패키지 관리자를 사용할 수 있게 됩니다.


FRPS를 백그라운드로 실행하고 상태 확인하기

내부망 프록시 도구 FRPS를 백그라운드에서 실행하는 방법이다. nohup ./frps -c frps.ini 명령을 실행해 프로세스를 백그라운드로 띄우고 로그를 /var/log/frp.log에 남긴다. 이후 ps aux | grep frp | grep -v grep 명령으로 FRPS 실행 상태를 확인한다.

后台运行FRPS

nohup ./frps -c frps.ini > /var/log/frp.log 2>&1 &

查看FRPS运行状态

ps -aux|grep frp| grep -v grep

Node.js + ws로 WebSocket 채팅방 만들기 예제

Node.js의 ws 라이브러리로 WebSocket 서버를 만들고, HTML+JavaScript로 그룹 채팅방을 구현한 예제다. npm으로 ws를 설치하고 8080 포트에서 서버를 띄운 뒤, 클라이언트가 보낸 메시지를 모든 연결된 클라이언트에 브로드캐스트한다. 사용자 이름은 IP+포트로 표시되며 서버·클라이언트 전체 코드를 제공한다.

使用ws创建WebSokcet服务器

Node.js原生API并未提供WebSocket的支持,因此,需要安装第三方包才能使用WebSocket功能。对于WebSocket的支持,在开源社区有非常多的选择,本例子采用的是“ws”框架(项目主页为https://github.com/websockets/ws)。

“ws”顾名思义是一个用于支持WebSocket客户端和服务器的框架。它易于使用,功能强大,且不依赖于其他环境。

想其他Node.js应用一样,使用ws的首选方式是使用npm来管理。以下命令行用于安装ws在应用里面:

npm install ws

具备了ws包之后,就可以创建WebSocket服务器了。以下是创建服务器的j简单示例:

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

上述例子服务器启动在8080端口。

聊天服务器的需求

聊天服务器的业务需求比较简单,是一个群聊聊天室。换言之,所有人发送的消息大家都可以见到。

当有新用户连接到服务器时,会以该用户的“IP+端口”作为用户的名称。

服务器的实现

根据前面知识的学习,实现一个聊天服务器比较简单,完整代码如下

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('open', function open() {
console.log('connected');
});

server.on('close', function close() {
console.log('disconnected');
});

server.on('connection', function connection(ws, req) {
const ip = req.connection.remoteAddress;
const port = req.connection.remotePort;
const clientName = ip + port;

console.log('%s is connected', clientName)

// 发送欢迎信息给客户端
ws.send("Welcome " + clientName);

ws.on('message', function incoming(message) {
console.log('received: %s from %s', message, clientName);

// 广播消息给所有客户端
server.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send( clientName + " -> " + message);
}
});

});

});

当客户端给服务器发送消息时,服务器会将该客户端的消息转发给所有客户端。

客户端的实现

客户端是通HTML+JavaScript的方式实现的。由于浏览器原生提供了WebSocket的API,所以并不需要ws框架的支持。

客户端client.html文件代码如下:

<body>
<script type="text/javascript">
var socket;
if (!window.WebSocket) {
window.WebSocket = window.MozWebSocket;
}
if (window.WebSocket) {
socket = new WebSocket("ws://localhost:8080/ws");
socket.onmessage = function (event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + '\n' + event.data
};
socket.onopen = function (event) {
var ta = document.getElementById('responseText');
ta.value = "连接开启!";
};
socket.onclose = function (event) {
var ta = document.getElementById('responseText');
ta.value = ta.value + "连接被关闭";
};
} else {
alert("你的浏览器不支持 WebSocket!");
}

function send(message) {
if (!window.WebSocket) {
return;
}
if (socket.readyState == WebSocket.OPEN) {
socket.send(message);
} else {
alert("连接没有开启.");
}
}
</script>
<form onsubmit="return false;">
<h3>WebSocket 聊天室:</h3>
<textarea id="responseText" style="width: 500px; height: 300px;"></textarea>
<br>
<input type="text" name="message" style="width: 300px" value="Welcome to waylau.com">
<input type="button" value="发送消息" onclick="send(this.form.message.value)">
<input type="button" onclick="javascript:document.getElementById('responseText').value=''"
value="清空聊天记录">
</form>
</body>

运行应用

首先启动服务器。执行下面的命令:

node index.js

接着用浏览器直接打开client.html文件,可以看到如下的聊天界面。

聊天界面

打开多个聊天窗口,就能模拟多个用户之间的群聊了。

群聊界面

검색엔진 노출 방지 방법 - robots.txt와 meta robots

검색엔진에 사이트가 노출되지 않도록 제어하는 방법을 정리한 글이다. robots.txt 파일의 User-agent, Disallow, Allow 규칙과 특정 디렉터리·페이지·구글봇만 차단하는 예시, URL 패턴 일치, 그리고 각 페이지에 넣는 meta robots 태그(noindex, nofollow) 사용법과 함께 구글 웹마스터 도움말 기준으로 설명한다.

제공해주신 검색엔진 크롤링 제어 방법에 관한 내용을 마크다운 형식으로 가독성 있게 정리해 드립니다.

검색엔진 노출 제어 가이드: robots.txt 및 Meta 태그 활용법

검색엔진 로봇의 접근을 제어하여 원치 않는 페이지가 검색 결과에 노출되지 않도록 하는 방법은 크게 두 가지가 있습니다. 이 가이드는 구글 웹마스터 도움말 센터의 표준 규약을 바탕으로 작성되었습니다.


1. robots.txt 파일을 이용하는 방법

robots.txt 파일은 웹사이트의 루트 디렉토리에 위치해야 하며, 검색 로봇이 사이트 정보를 수집하기 전 가장 먼저 확인하는 규약 파일입니다.

기본 작성 규칙

  • User-Agent: 규칙을 적용할 로봇의 종류 (전체는 *)
  • Disallow: 수집을 차단할 페이지 경로
  • Allow: 차단된 경로 내에서 예외적으로 허용할 경로

주요 설정 예시

설정 목적 코드 예시
모든 봇의 사이트 전체 차단 User-Agent: *<br>Disallow: /
특정 디렉토리 및 하위 항목 차단 User-Agent: *<br>Disallow: /abcd/
특정 페이지 차단 User-Agent: *<br>Disallow: /index.html
특정 로봇(구글봇)만 차단 User-Agent: Googlebot<br>Disallow: /
특정 확장자(.gif) 파일 차단 User-Agent: Googlebot<br>Disallow: /*.gif$

주의사항

  • 대소문자 구분: URL 경로 작성 시 대소문자를 정확히 구분해야 합니다.
  • 슬래시(/) 활용: Disallow: /abcd라고 적으면 abcd 디렉토리뿐만 아니라 파일명이 abcd로 시작하는 모든 파일도 차단됩니다.
  • 표준 준수: 이 설정은 검색 로봇이 표준 규약을 따를 때만 유효합니다.

2. Meta 태그를 이용하는 방법

사이트 루트 권한이 없어 robots.txt 파일을 수정할 수 없을 때, 개별 HTML 페이지의 <head> 섹션에 태그를 삽입하여 제어하는 방식입니다.

주요 설정 예시

  • 모든 로봇의 색인 생성 및 링크 수집 차단
    <meta name="robots" content="noindex, nofollow">
  • 구글 로봇만 특정하여 차단
    <meta name="googlebot" content="noindex, nofollow">
  • 페이지 색인은 허용하되, 외부 링크 추적만 차단
    <meta name="robots" content="nofollow">
  • 페이지 내 이미지 색인 생성 차단
    <meta name="robots" content="noimageindex">

관련 참고 링크



Let's create something great together.

프로젝트 문의 및 견적 요청은 언제든 환영합니다.