#필요한 환경 #brew install gromgit/fuse/sshfs #macFUSE 최신버젼 설치 5.1.2 macOS 12 or later Apple Silicon or Intel Released on 20 Nov 2025 #https://macfuse.github.io/ #!/bin/zsh # ===== 공통 설정 ===== LOGFILE="$HOME/Library/Logs/sshfs_mount.log" log() { local ts ts="$(date '+%Y-%m-%d %H:%M:%S')" echo "[$ts] $*" | tee -a "$LOGFILE" } # ==================== log "========== SSHFS MOUNT SCRIPT START ==========" # ===== 기본 정보 로그 ===== log "User: $(whoami)" log "Home: $HOME" log "PWD : $(pwd)" log "Shell: $SHELL" log "uname: $(uname -a)" # ========================= # ===== 설정값 ===== REMOTE_USER="administrator" # 원격 서버 계정 REMOTE_HOST="123.123.123.123" # 원격 서버 주소/IP REMOTE_DIR="/" # 서버에서 마운트할 경로 (※ 실제 경로로 수정!) LOCAL_MOUNT="$HOME/mnt/server" # 로컬에 마운트할 폴더 REMOTE_PORT=22 # SSH 포트 SSH_KEY="$HOME/.ssh/id_ed25519" # 사용할 SSH 키 경로 (패스워드 접속이면 크게 영향 없음) # sshfs 옵션 (원하는대로 추가 가능, 마운트 되는 볼륨 이름을 수정하세요 예: Home_C) OPTIONS="volname=볼륨이름,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,IdentityFile=$SSH_KEY,auto_cache,defer_permissions" # ================= log "Config REMOTE_USER = $REMOTE_USER" log "Config REMOTE_HOST = $REMOTE_HOST" log "Config REMOTE_DIR = $REMOTE_DIR" log "Config LOCAL_MOUNT = $LOCAL_MOUNT" log "Config REMOTE_PORT = $REMOTE_PORT" log "Config SSH_KEY = $SSH_KEY" log "Config OPTIONS = $OPTIONS" # ===== sshfs 바이너리 위치 찾기 ===== SSHFS_BIN="$(command -v sshfs || true)" if [ -z "$SSHFS_BIN" ]; then # Homebrew 기본 경로도 한 번 찍어봄 if [ -x "/opt/homebrew/bin/sshfs" ]; then SSHFS_BIN="/opt/homebrew/bin/sshfs" log "sshfs not in PATH, but found at /opt/homebrew/bin/sshfs" else log "ERROR: sshfs command not found. 설치 또는 PATH 설정 필요." log " 예: brew install gromgit/fuse/sshfs" log "========== SSHFS MOUNT SCRIPT END (FAIL: NO SSHFS) ==========" exit 1 fi else log "Found sshfs at: $SSHFS_BIN" fi # ================================ # ===== 마운트 폴더 생성 ===== if [ ! -d "$LOCAL_MOUNT" ]; then log "LOCAL_MOUNT does not exist, creating: $LOCAL_MOUNT" mkdir -p "$LOCAL_MOUNT" else log "LOCAL_MOUNT already exists: $LOCAL_MOUNT" fi # ============================= # ===== [수정됨] 이미 마운트 되어 있는지 확인 (좀비 체크 기능 추가) ===== if mount | grep -q "on $LOCAL_MOUNT "; then # 마운트 목록에는 있는데, 실제로 접속이 되는지 확인 (타임아웃 5초) # ls 명령어로 파일 목록을 읽어봄 if gtimeout 5s ls "$LOCAL_MOUNT" >/dev/null 2>&1 || timeout 5s ls "$LOCAL_MOUNT" >/dev/null 2>&1; then log "Already mounted and RESPONSIVE. (Good)" log "========== SSHFS MOUNT SCRIPT END (ALREADY SUCCESS) ==========" exit 0 else log "WARNING: Mount entry exists but UNRESPONSIVE (Zombie). Force unmounting..." # 좀비 상태이므로 강제 해제 후 다시 마운트 진행 diskutil unmount force "$LOCAL_MOUNT" >/dev/null 2>&1 sleep 2 fi else log "No existing mount found on $LOCAL_MOUNT. Proceeding to mount." fi # =============================================================== # ===== sshfs 실행 전 디버그 ===== log "About to run sshfs with the following parameters:" log " CMD : $SSHFS_BIN -p $REMOTE_PORT -o $OPTIONS $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR $LOCAL_MOUNT" log " NOTE : 이 시점에서 비밀번호를 물어볼 수 있습니다 (패스워드 로그인 사용 시)." # ================================ # ===== sshfs 실행 ===== # stderr/stdout 모두 로그로 보냄 "$SSHFS_BIN" -p "$REMOTE_PORT" -o "$OPTIONS" \ "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR" "$LOCAL_MOUNT" >>"$LOGFILE" 2>&1 SSHFS_EXIT_CODE=$? log "sshfs exit code = $SSHFS_EXIT_CODE" if [ $SSHFS_EXIT_CODE -ne 0 ]; then log "ERROR: sshfs mount failed with exit code $SSHFS_EXIT_CODE." log " 아래는 최근 로그 20줄입니다:" tail -n 20 "$LOGFILE" log "========== SSHFS MOUNT SCRIPT END (FAIL) ==========" exit $SSHFS_EXIT_CODE fi # ===================== # ===== 마운트 후 검증 ===== if mount | grep -q "on $LOCAL_MOUNT "; then log "Mount check: SUCCESS. $LOCAL_MOUNT is now mounted." else log "WARNING: sshfs reported success, but mount check did not find $LOCAL_MOUNT." fi log "Directory listing of $LOCAL_MOUNT (for debug):" ls -al "$LOCAL_MOUNT" | tee -a "$LOGFILE" # ======================= log "========== SSHFS MOUNT SCRIPT END (SUCCESS) =========="