
ssh-chat (현대 C 언어로 구현)

일반 BBS 소프트웨어
SSH-Chatter는 Go ssh-chat 서버의 C 재구현에서 시작되었습니다. 현대적인 C 패턴과 소규모의 테스트 가능한 코어를 사용하면서 원래 동작을 반영/확장합니다. 이 서버는 SSH/TELNET 연결을 수신 대기하며, 인증된 모든 사용자를 공유 채팅방에 배치하여 Go 참조 구현과 동일한 명령 표면을 제공합니다.
C를 이해하는 데 왜 그렇게 오래 걸리는지 아시나요? 그것은 본능이기 때문입니다.
/rss list, /rss read <tag> 명령어로 접근 가능하며, /rss add <url> <tag> 및 /rss del <tag> (운영자 전용)를 통해 방에서 함께 헤드라인을 탐색할 수 있습니다./delete-msg 명령어./bbs 명령어는 태그, 댓글, 부밍, 다중 줄 편집기를 갖춘 몰입형 레트로 게시판 시스템을 잠금 해제합니다.
list [hot|top|new|bumped|all] 명령어를 사용하여 bumped (최근 활동), hot (점수 및 댓글 기준 트렌드), top (가장 높은 순 추천 점수), 또는 new (생성 날짜)로 정렬된 게시물을 봅니다.search <query>로 게시물 제목, 본문, 작성자, 태그를 대소문자 구분 없이 즉시 검색합니다.▲ 12 💬 5)로 직접 표시합니다./bbs 접두사 없이 명령어를 자동으로 라우팅합니다./asciiart 라이브 편집기: 640줄 제한, IP당 10분 쿨다운, 여러 줄 출력, Ctrl+A로 취소, Ctrl+S 또는 로캘 인식 기본값 >/__ARTWORK_END>로 제출하는 키보드 단축키 제공./birthday, LAN 운영자가 주소별로 권한을 위임할 수 있는 /grant <ip>, 그리고 최상위 LAN 관리자가 권한을 회수할 수 있는 /revoke <ip> 명령어./ban 업그레이드./weather <city>.

코드베이스는 의도적으로 간결하게 구성되어 있어 새로운 기여자가 빠르게 탐색할 수 있습니다:
| 경로 | 설명 |
|---|---|
src/main.c | 명령줄 파싱 및 프로세스 부트스트랩 (바인드 주소, 포트, MOTD, 호스트 키 디렉토리). |
src/host_aggregate.c, include/ssh_chatter/host.h | 채팅 호스트 구현 – 세션 수명 주기, MOTD 처리, 향후 메시지 브로드캐스트 로직을 위한 훅. |
src/host | 모듈식 호스트 서브시스템으로 src/host_aggregate.c를 통해 단일 번역 단위로 컴파일됩니다. |
include/ssh_chatter | 데몬, 스트레스 도구, 번역 백엔드를 위한 공유 헤더. |
include/ssh_chatter/contexts | 연결별 상태를 캡슐화하는 session_ctx_t 및 관련 구조체의 정의. |
data/banner/banner | CHATTER_WELCOME_BANNER로 지정할 수 있는 샘플 환영 배너. |
scripts/install_chatter_service.sh | 편리한 설치 스크립트로 바이너리를 빌드하고 /usr/local/bin 아래에 설치하며 systemd 유닛(chatter.service)을 연결합니다. |
scripts/install_dependencies.sh | Debian/Ubuntu 시스템에서 빌드 전제 조건을 위한 최소 패키지 설치 프로그램. |

main 브랜치와 최신 상태 유지work 브랜치는 업스트림 개발과 정기적으로 분기되어 대규모 기능이 프로덕션 트래픽을 방해하지 않고 배양될 수 있도록 합니다. main과 동기화할 때가 되면 최신 트리를 풀(pull)하고 로컬에서 병합한 후 풀 리퀘스트를 여십시오:```bash
git fetch origin main
git checkout work
git merge --no-ff origin/main
충돌을 제자리에서 해결하고 (`src/host_aggregate.c` 헬퍼 루틴은 이미 `main`의 레이아웃을 반영하므로 일반적으로 병합은 간단합니다) `make`를 실행하여 푸시하기 전에 빌드가 여전히 성공하는지 확인하세요.
## 자동화 훅
- `host_snapshot_last_captcha`는 가장 최근에 생성된 캡챠 프롬프트와 답변을 타임스탬프와 함께 노출하여 외부 클라이언트가 무인 자동화를 대신하여 챌린지를 전달할 수 있도록 합니다.
## 보안 강화
- `scripts/safe_permission.sh`는 런타임 데이터 파일(BBS 상태, 투표 상태, 쿨다운 스냅샷, 일반 채터 상태)의 소유권과 모드를 강화합니다. 배포 후 실행하여 데이터 디렉토리를 `ssh-chatter`로 제한하고 각 파일이 `0600`으로 설정되도록 합니다. 명시적 경로를 전달하거나 실행 전에 `STATE_ROOT` 또는 해당 `CHATTER_*_FILE` 환경 변수를 내보내 대상을 재정의합니다.
- 백그라운드 BBS 와치독은 주기적으로 게시물과 댓글을 AI 중재 파이프라인(기본 Gemini, Ollama 대체)에 전달합니다. 플래그된 게시물은 자동으로 제거되고 방에 공지가 전송됩니다.
- 채팅 메시지, ASCII 아트, BBS 게시물/댓글은 AI 중재 파이프라인을 통해 흐릅니다. `CHATTER_SECURITY_AI=on`으로 활성화합니다 (Gemini의 경우 `GEMINI_API_KEY` 설정; 데몬은 자동으로 `http://127.0.0.1:11434`의 로컬 Ollama 엔드포인트로 대체합니다). `CHATTER_SECURITY_FILTER=off`로 모든 것을 비활성화합니다. 모든 공급자가 실패하면 필터는 자동으로 비활성화되어 콘텐츠를 자동으로 삭제하는 대신 대화가 계속 흐르도록 합니다.
- SSH 전송은 최신 키 교환, 암호화, MAC으로 고정되며 모든 브리지 페이로드는 삼중 AES-256-GCM 양파로 감싸져 중계기는 암호문만 볼 수 있습니다.
- 계층형 필터를 작동시키는 의심스러운 제출은 이제 IP별로 추적됩니다. 반복된 적중 시 활성화되면 자동 킥 및 밴이 트리거되는 반면, 빠른 재연결 감지기는 더 긴 복구 기간을 허용하여 불안정한 네트워크 세션이 불이익 없이 다시 참여할 수 있습니다. 자동 밴 항목은 **기본적으로 꺼져 있습니다**. 활성화하려면 `CHATTER_AUTO_BAN=on` (또는 `true`/`1`)을 설정하거나 변수를 설정하지 않은 상태로 두어 자동 밴 항목을 기록하지 않고 경고 및 제한을 유지합니다.
- 운영자는 `CHATTER_PROTECTED_IPS`로 신뢰할 수 있는 진입점(VPN 출구, 리버스 프록시, localhost)을 표시할 수 있습니다 (쉼표로 구분, 기본값 `127.0.0.1,::1,192.168.0.1`). 이로 인해 긴급 밴이 데몬을 자체 제어 평면에서 잠그지 않습니다.
## 파일 저장 및 전송
- 모든 사용자 관리 파일은 이제 `/etc/ssh-chatter/user-files`에 있습니다 (`CHATTER_FILESTORE_PATH`로 재정의, 레거시 대체: `CHATTER_FILE_STORAGE_ROOT`). 데몬은 필요한 경우 디렉토리를 생성하고 업로드를 해당 디렉토리로 제한합니다.
- SSH 클라이언트는 사용자 정의 래퍼 없이 표준 `scp`를 사용합니다. `/name.ext`를 저장소 트리의 루트로 간주합니다: `scp my.zip user@host:/demos/my.zip`은 `/etc/ssh-chatter/user-files/demos/my.zip`에 쓰고, `scp user@host:/readme.txt ./`는 `/etc/ssh-chatter/user-files/readme.txt`를 다운로드합니다.
- TELNET 클라이언트는 새로운 `/filestore` 명령을 사용합니다. `/filestore`는 사용 가능한 파일을 나열하고, `/filestore-upload`는 `rz` 세션을 시작하며, `/filestore-download <name>`은 `sz` 세션을 시작합니다. 서버에 `lrzsz` (또는 `rz`/`sz`를 제공하는 패키지)를 설치하여 ZMODEM 백엔드가 해당 헬퍼를 생성할 수 있도록 합니다.
- `/filestore-upload`는 선택적 대상을 허용합니다 (예: `/filestore-upload /kitten/meow.png`). SSH-Chatter는 `/kitten` 디렉터리를 자동으로 생성하고 업로드된 파일을 그곳에 배치하며, 이는 SCP가 `user@host:/kitten/meow.png`와 같은 경로를 사용하는 방식을 반영합니다.
- 두 전송 방식은 혼합하여 사용할 수 있습니다: 무인 스크립트 전송에는 SSH, 내장 ZMODEM 도구가 있는 복고풍 BBS 클라이언트에는 TELNET.
## 모스 릴레이
SSH-Chatter는 아마추어 햄 라디오 중계를 지원합니다.
이는 전역 모스 신호를 보여줍니다.
보려면 `/morse on`, 보내려면 `/morse-reply`.
### 프로토콜 세부사항
구현은 Binkp 프로토콜 사양을 따릅니다:
- 2바이트 헤더가 있는 표준 Binkp 프레임 구조
- 세션 비밀번호 인증 (CMD\_PWD/CMD\_OK)
- 60초마다 킵얼라이브 메커니즘 (CMD\_NUL)
- 메시지 동기화를 위한 사용자 지정 CHAT 명령 (CMD\_CHAT, 확장)
## 전제 조건
프로젝트를 빌드하려면 다음이 포함된 POSIX 환경이 필요합니다:
- C23 호환 컴파일러 (예: `gcc` 또는 `clang`)
- `make`
- `libssh` 개발 헤더 및 라이브러리 (Debian/Ubuntu에서는 `libssh-dev`)
- `libcurl` 개발 헤더 및 라이브러리 (Debian/Ubuntu에서는 `libcurl4-openssl-dev`)
- `uchardet` 개발 헤더 및 라이브러리 (Debian/Ubuntu에서는 `libuchardet-dev`)
- `icu` (International Components for Unicode) 개발 헤더 및 라이브러리 (Debian/Ubuntu에서는 `libicu-dev`)
- `lz4` 압축 라이브러리 및 개발 헤더 (Debian/Ubuntu에서는 `liblz4-dev`)
- POSIX 스레드 (일반적으로 시스템 `libpthread`에서 제공)
- `python3-pygments` (Tetris 위장 화면을 위한 `pygmentize` 하이라이터 제공)
Debian/Ubuntu에서는 다음 명령으로 의존성을 설치할 수 있습니다:```bash
sudo apt-get update
sudo apt-get install build-essential libssh-dev libcurl4-openssl-dev libuchardet-dev libicu-dev liblz4-dev
리포지토리를 클론하고 제공된 Makefile을 사용하십시오:```bash
make
This produces an `ssh-chatter` binary in the repository root and a `libssh_chatter_backend.so` shared object that exposes the
translation helpers for reuse in other applications. Clean intermediate artifacts with `make clean`.
### 공유 번역 백엔드 사용하기
The shared object reuses the server's C translation pipeline (including ANSI placeholder preservation) so other processes can
obtain translations without spawning the full SSH host. Link against `libssh_chatter_backend.so` and include
`include/ssh_chatter/ssh_chatter_backend.h`:```c
#include "ssh_chatter/ssh_chatter_backend.h"
int main(void) {
char translated[4096];
char detected[64];
if (ssh_chatter_backend_translate_line("Hello, world!", "ko", translated, sizeof(translated), detected, sizeof(detected))) {
printf("Detected %s -> %s\n", detected, translated);
}
}
환경 변수에 GEMINI_API_KEY (선택적으로 GEMINI_API_BASE 또는 GEMINI_MODEL)를 설정하여 헬퍼가 Google Generative Language API에 접근할 수 있도록 합니다. 이는 주 데몬의 런타임 요구 사항을 반영합니다. 채팅 서버를 시작하기 전에 ./scripts/test_gemini_connection.sh를 실행하여 자격 증명이 아웃바운드 호출을 허용하는지 확인할 수 있습니다. 이 스크립트는 원시 Gemini 응답을 출력하므로 요청이 성공했는지 확인할 수 있습니다.