본문 바로가기
ChatGPT/프로...Linux

Win->Linux 카피시 라인마다... "^M" 제거

by 크크다스 2025. 9. 3.
반응형

📌  autocutsel로

PRIMARY↔CLIPBOARD 동기화는 그대로 두고,

그 흐름 위에 \r(CR) 제거 필터를 얹는 방식으로 깔끔하게 해결하는 방법


아래 스크립트는 클립보드가 바뀔 때마다 내용을 읽어 \r 을 제거한 뒤

다시 CLIPBOARD/PRIMARY 모두에 반영합니다. (root GUI 세션/RDP 환경 고려)

1) 준비물 설치

 
apt update apt install -y autocutsel xclip

2) CR 제거 데몬 스크립트 만들기

/usr/local/bin/clipboard_crfix.sh 생성:

cat >/usr/local/bin/clipboard_crfix.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

# --- RDP 세션에서 DISPLAY/XAUTHORITY 보정 (root GUI 세션 고려) ---
# DISPLAY가 비어있거나 :0이면, xrdp가 쓰는 :10+ 디스플레이로 자동 설정
if [[ -z "${DISPLAY:-}" || "${DISPLAY}" = ":0" ]]; then
  for d in /tmp/.X11-unix/X*; do
    n="${d##*/X}"
    [[ "$n" =~ ^[0-9]+$ ]] && (( n >= 10 )) && export DISPLAY=":$n.0" && break
  done
fi
export XAUTHORITY="${XAUTHORITY:-$HOME/.Xauthority}"
export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/0}"
mkdir -p "$XDG_RUNTIME_DIR" && chmod 700 "$XDG_RUNTIME_DIR" && chown root:root "$XDG_RUNTIME_DIR" 2>/dev/null || true

# --- 폴링 간격(ms) ---
POLL_MS=200

# 이전 값 해시 저장용
prev_hash=""

# 현재 클립보드 읽기 함수 (비어있어도 정상 취급)
read_cb() {
  xclip -selection clipboard -o 2>/dev/null || true
}

# PRIMARY/CLIPBOARD 동기반영
write_both() {
  # stdin을 양쪽에 넣음
  tee >(xclip -selection primary -i -quiet 2>/dev/null >/dev/null) \
      >(xclip -selection clipboard -i -quiet 2>/dev/null >/dev/null) >/dev/null
}

while :; do
  # 현재 클립보드(Windows->RDP 경로는 주로 CLIPBOARD로 들어옴)
  cur="$(read_cb)"
  # \r 제거
  fixed="${cur//$'\r'/}"

  # 변경되었으면 반영
  hash_now="$(printf '%s' "$fixed" | sha1sum | awk '{print $1}')"
  if [[ "$hash_now" != "$prev_hash" ]]; then
    printf '%s' "$fixed" | write_both
    prev_hash="$hash_now"
  fi

  # 짧게 쉼
  usleep() { perl -e "select(undef,undef,undef,$1/1000.0)"; }
  usleep "$POLL_MS"
done
EOF

chmod +x /usr/local/bin/clipboard_crfix.sh
 

동작 원리

  • Windows → (RDP) → CLIPBOARD 로 들어오는 텍스트를 주기적으로 읽어 \r 제거
  • 정제된 텍스트를 CLIPBOARD & PRIMARY 양쪽에 다시 써서, 마우스 중클릭 붙여넣기도 동일하게 동작
  • RDP(root) 세션에서 DISPLAY가 :0로 잡히는 문제를 자동 교정

3) XFCE 자동 시작에 등록 (root 전용)

root GUI 세션에서 자동 실행되도록 등록합니다.
(autocutsel 두 개를 먼저 띄우고, 그 다음 필터 스크립트를 실행)

 
mkdir -p /root/.config/autostart

cat >/root/.config/autostart/autocutsel.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=autocutsel
Comment=Sync PRIMARY and CLIPBOARD
Exec=sh -c "autocutsel -fork && autocutsel -selection PRIMARY -fork"
X-GNOME-Autostart-enabled=true
EOF

cat >/root/.config/autostart/clipboard-crfix.desktop <<'EOF'
[Desktop Entry]
Type=Application
Name=clipboard-crfix
Comment=Remove CR (\r) on clipboard changes and re-sync to PRIMARY/CLIPBOARD
Exec=/usr/local/bin/clipboard_crfix.sh
X-GNOME-Autostart-enabled=true
EOF

 

시스템 전체 사용자에 적용하고 싶으면 /etc/xdg/autostart/ 아래에 같은 .desktop 파일을 두시면 됩니다.


4) 즉시 수동 테스트 (재로그인 전)

현재 세션에서 바로 띄워 확인할 수도 있습니다:

autocutsel -fork
autocutsel -selection PRIMARY -fork
/usr/local/bin/clipboard_crfix.sh &
 
  • 이제 Windows에서 복사한 텍스트를 Ubuntu에 붙여넣으면 ^M 없이 들어옵니다.
  • 마우스 드래그(PPRIMARY)도 autocutsel이 CLIPBOARD로 동기화하고, 필터가 \r을 제거해 두 영역이 항상 일치합니다.

5) 참고/튜닝 포인트

  • 폴링 간격을 바꾸고 싶으면 스크립트의 POLL_MS 값을 조정하세요(기본 200ms).
  • 대용량 바이너리/이미지 클립보드는 의도치 않게 변환될 수 있으니(보통 텍스트 작업에서만 사용), 필요시 텍스트 길이 제한을 두거나 MIME 타입 검사를 추가할 수 있습니다.
  • 일반 사용자용으로도 쓰려면, 위 경로들을 해당 사용자 홈(~/.config/autostart)에 만들어 주시면 됩니다.
 

 

반응형