shell-13: /etc/init.d/munge

本文介绍了一个用于管理MUNGE认证服务的Shell脚本,该脚本定义了启动、停止、重启等操作,并根据不同Linux发行版进行了适配。
[caoj7@node001 study]$ cat /etc/init.d/munge
#!/bin/sh
###############################################################################
# $Id: munge.init.in 890 2011-01-20 01:54:21Z chris.m.dunlap $
###############################################################################
# Written by Chris Dunlap <cdunlap@llnl.gov>.
# Copyright (C) 2007-2011 Lawrence Livermore National Security, LLC.
# Copyright (C) 2002-2007 The Regents of the University of California.
# UCRL-CODE-155910.
###############################################################################
# chkconfig:          - 40 60
# Description:        Start/Stop the MUNGE authentication service.
###############################################################################
### BEGIN INIT INFO
# Provides:           munge
# Required-Start:     $remote_fs $time
# Required-Stop:      $remote_fs $time
# Should-Start:       $named $syslog
# Should-Stop:        $named $syslog
# Short-Description:  Start/Stop the MUNGE authentication service.
# Description:        MUNGE (MUNGE Uid 'N' Gid Emporium) is a highly scalable
#                     authentication service for creating and validating
#                     credentials.
### END INIT INFO
###############################################################################

unset DESC DAEMON CONFIG DAEMON_ARGS PIDFILE NICE USER SIGHUP_RELOAD

prefix="/usr/local"
exec_prefix="${prefix}"
sbindir="${exec_prefix}/sbin"
sysconfdir="/etc"
localstatedir="/var"

DESC="MUNGE"
DAEMON="$sbindir/munged"
#CONFIG=#_NOT_SUPPORTED_#
#DAEMON_ARGS=
PIDFILE="$localstatedir/run/munge/munged.pid"
#NICE=
USER="daemon"
#SIGHUP_RELOAD=#_NOT_SUPPORTED_#

###############################################################################

service_init ()
{
# Determine the system type and initialize the environment.
#
# Note that the shell positional parameters must be preserved when calling
#   this function in order for SuSE to initialize its environment properly.
##
  PATH=/sbin:/usr/sbin:/bin:/usr/bin
  DAEMON_NAME="`basename \"$DAEMON\"`"
  SCRIPT_NAME="`basename \"$0\" .init | sed 's/^[SK][0-9][0-9]*//'`"
  SIGTERM_TIMEOUT="3"
  STATUS=0

  # Read configuration defaults to override variables:
  #   $CONFIG, $DAEMON_ARGS, $PIDFILE, $USER, $NICE, $SIGHUP_RELOAD
  ##
  for dir in "$sysconfdir/default" "$sysconfdir/sysconfig"; do
    [ -r "$dir/$SCRIPT_NAME" ] && . "$dir/$SCRIPT_NAME"
  done
  [ -z "$DAEMON_ARGS" -a -n "$OPTIONS" ] && DAEMON_ARGS="$OPTIONS"
  [ "`id | sed 's/^uid=\([0-9]*\).*/\1/'`" -ne 0 ] && unset USER
  expr -- "$NICE" : '[0-9]*$' >/dev/null 2>&1 && NICE="+$NICE"
  [ -n "$SIGHUP_RELOAD" -a "$SIGHUP_RELOAD" != 0 ] \
    && RELOAD=1 || unset RELOAD

  if [ -f /etc/debian_version -a -x /sbin/start-stop-daemon ]; then
    SYSTEM="DEBIAN"
    [ -x "$DAEMON" ] || exit 0                  # pkg removed but not purged
    [ -r /etc/default/rcS ] && . /etc/default/rcS
    [ -r /lib/init/vars.sh ] && . /lib/init/vars.sh
    [ -r /lib/lsb/init-functions ] && . /lib/lsb/init-functions
  elif [ -f /etc/redhat-release -a -r /etc/init.d/functions ]; then
    SYSTEM="REDHAT"
    . /etc/init.d/functions
    RH_SUBSYS="/var/lock/subsys/$DAEMON_NAME"
  elif [ -f /etc/SuSE-release -a -r /etc/rc.status ]; then
    SYSTEM="SUSE"
    . /etc/rc.status
    rc_reset
  elif [ -r /lib/lsb/init-functions ]; then
    SYSTEM="LSB"
    . /lib/lsb/init-functions
  else
    SYSTEM="OTHER"
  fi

  # Exit if the package has been removed.
  ##
  [ -x "$DAEMON" ] || exit 5                    # LSB: program not installed

  # Exit if the configuration has been removed.
  ##
  [ -z "$CONFIG" -o -r "$CONFIG" ] || exit 6    # LSB: program not configured
}

service_fini ()
{
# Return the exit status.
##
  case $SYSTEM in
    SUSE)
      rc_exit
      ;;
    DEBIAN|REDHAT|LSB|*)
      exit $STATUS
      ;;
  esac
}

service_start ()
{
# Start the service.
#
# Required by LSB, where running "start" on a service already running should be
#   considered successful.
##
  log_init "Starting $DESC" "$DAEMON_NAME"

  VARRUNDIR="$localstatedir/run/munge"
  if [ ! -d "$VARRUNDIR" ]; then
    mkdir -m 755 -p "$VARRUNDIR"
    [ -n "$USER" ] && chown "$USER" "$VARRUNDIR"
  fi

  case $SYSTEM in
    DEBIAN)
      if $0 status >/dev/null 2>&1; then
        STATUS=0
      else
        ERRMSG=`start-stop-daemon --start --quiet \
          ${NICE:+"--nicelevel"} ${NICE:+"$NICE"} \
          ${USER:+"--chuid"} ${USER:+"$USER"} \
          ${PIDFILE:+"--pidfile"} ${PIDFILE:+"$PIDFILE"} \
          --exec "$DAEMON" -- $DAEMON_ARGS 2>&1`
        STATUS=$?
      fi
      ;;
    REDHAT)
      if $0 status >/dev/null 2>&1; then
        STATUS=0
      else
        daemon ${NICE:+"$NICE"} ${USER:+"--user"} ${USER:+"$USER"} \
          "$DAEMON" $DAEMON_ARGS
        STATUS=$?
      fi
      [ $STATUS -eq 0 ] && touch "$RH_SUBSYS" >/dev/null 2>&1
      ;;
    SUSE)
      ERRMSG=`startproc ${NICE:+"-n"} ${NICE:+"$NICE"} \
        ${USER:+"-u"} ${USER:+"$USER"} \
        ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} \
        "$DAEMON" $DAEMON_ARGS 2>&1`
      rc_status -v
      STATUS=$?
      ;;
    LSB)
      if [ -n "$USER" ]; then
        ERRMSG=`su "$USER" -c "/sbin/start_daemon \
          ${NICE:+\"-n\"} ${NICE:+\"$NICE\"} \
          ${PIDFILE:+\"-p\"} ${PIDFILE:+\"$PIDFILE\"} \
          \"$DAEMON\" $DAEMON_ARGS" 2>&1`
      else
        ERRMSG=`start_daemon ${NICE:+"-n"} ${NICE:+"$NICE"} \
          ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} "$DAEMON" $DAEMON_ARGS 2>&1`
      fi
      STATUS=$?
      ;;
    *)
      if $0 status >/dev/null 2>&1; then
        STATUS=0
      else
        [ -n "$NICE" ] && nice="nice -n $NICE"
        if [ -n "$USER" ]; then
          ERRMSG=`su "$USER" -c "$nice \"$DAEMON\" $DAEMON_ARGS" 2>&1`
        else
          ERRMSG=`$nice "$DAEMON" $DAEMON_ARGS 2>&1`
        fi
        STATUS=$?
      fi
      ;;
  esac
  log_fini "$STATUS" "$ERRMSG"
}

service_stop ()
{
# Stop the service.
#
# Required by LSB, where running "stop" on a service already stopped or not
#   running should be considered successful.
##
  log_init "Stopping $DESC" "$DAEMON_NAME"
  case $SYSTEM in
    DEBIAN)
      if ! $0 status >/dev/null 2>&1; then
        STATUS=0
      else
        start-stop-daemon --stop --quiet \
          ${PIDFILE:+"--pidfile"} ${PIDFILE:+"$PIDFILE"} \
          --name "$DAEMON_NAME" ${SIGTERM_TIMEOUT:+"--retry"} \
          ${SIGTERM_TIMEOUT:+"$SIGTERM_TIMEOUT"} >/dev/null 2>&1
        STATUS=$?
      fi
      ;;
    REDHAT)
      if ! $0 status >/dev/null 2>&1; then
        STATUS=0
      else
        killproc "$DAEMON"
        STATUS=$?
      fi
      [ $STATUS -eq 0 ] && rm -f "$RH_SUBSYS" >/dev/null 2>&1
      ;;
    SUSE)
      killproc ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} \
        ${SIGTERM_TIMEOUT:+"-t"} ${SIGTERM_TIMEOUT:+"$SIGTERM_TIMEOUT"} \
        "$DAEMON"
      rc_status -v
      ;;
    LSB)
      killproc ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} "$DAEMON"
      STATUS=$?
      ;;
    *)
      signal_process "$DAEMON"
      rc=$?
      [ $rc -eq 0 -o $rc -eq 2 ] && STATUS=0 || STATUS=1
      ;;
  esac
  log_fini "$STATUS"
  [ -f "$PIDFILE" ] && rm -f "$PIDFILE"
}

service_restart ()
{
# Stop and restart the service if it is already running;
#   otherwise, start the service.
#
# Required by LSB, where running "restart" on a service already stopped or not
#   running should be considered successful.
##
  if $0 status >/dev/null 2>&1; then
    $0 stop && $0 start
  else
    $0 start
  fi

  case $SYSTEM in
    SUSE)
      rc_status
      ;;
    DEBIAN|REDHAT|LSB|*)
      STATUS=$?
      ;;
  esac
}

service_try_restart ()
{
# Restart the service if it is already running.
#
# Optional for LSB, where running "try-restart" on a service already stopped or
#   not running should be considered successful.
# Also known as "condrestart" by RedHat.
##
  case $SYSTEM in
    REDHAT)
      [ -f "$RH_SUBSYS" ] && $0 restart || :
      STATUS=$?
      ;;
    SUSE)
      $0 status >/dev/null 2>&1 && $0 restart || rc_reset
      rc_status
      ;;
    DEBIAN|LSB|*)
      $0 status >/dev/null 2>&1 && $0 restart || :
      STATUS=$?
      ;;
  esac
}

service_reload ()
{
# Reload the configuration without stopping and restarting the service.
#
# Optional for LSB.
##
  [ -z "$RELOAD" ] && STATUS=3          # LSB: unimplemented feature

  log_init "Reloading $DESC" "$DAEMON_NAME"
  case $SYSTEM in
    DEBIAN)
      if [ -n "$RELOAD" ]; then
        start-stop-daemon --stop --quiet --signal HUP \
          ${PIDFILE:+"--pidfile"} ${PIDFILE:+"$PIDFILE"} \
          --name "$DAEMON_NAME" >/dev/null 2>&1
        STATUS=$?
      fi
      ;;
    REDHAT)
      if [ -n "$RELOAD" ]; then
        killproc "$DAEMON" -HUP
        STATUS=$?
      else
        echo_failure
      fi
      ;;
    SUSE)
      if [ -n "$RELOAD" ]; then
        killproc -HUP ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} "$DAEMON"
      else
        rc_failed $STATUS
      fi
      rc_status -v
      ;;
    LSB)
      if [ -n "$RELOAD" ]; then
        killproc ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} "$DAEMON" -HUP
        STATUS=$?
      fi
      ;;
    *)
      if [ -n "$RELOAD" ]; then
        signal_process "$DAEMON" "HUP"
        STATUS=$?
      fi
      ;;
  esac
  log_fini "$STATUS"
}

service_force_reload ()
{
# Reload the configuration if the service supports this;
#   otherwise, restart the service if it is already running.
#
# Required by LSB, where running "force-reload" on a service already stopped or
#   not running should be considered successful.
##
  if [ -n "$RELOAD" ]; then
    $0 reload
  else
    $0 try-restart
  fi

  case $SYSTEM in
    SUSE)
      rc_status
      ;;
    DEBIAN|REDHAT|LSB|*)
      STATUS=$?
      ;;
  esac
}

service_status ()
{
# Print the current status of the service.
#
# Required by LSB.
##
  case $SYSTEM in
    REDHAT)
      status "$DAEMON"
      STATUS=$?
      ;;
    SUSE)
      printf "Checking for service $DESC: "
      checkproc ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} "$DAEMON"
      rc_status -v
      ;;
    LSB)
      printf "Checking status of $DESC: "
      pids=`pidofproc ${PIDFILE:+"-p"} ${PIDFILE:+"$PIDFILE"} \
        "$DAEMON" 2>/dev/null`
      STATUS=$?
      if [ $STATUS -eq 0 -a -n "$pids" ]; then
        echo "running."
      elif [ $STATUS -ne 0 -a -s "$PIDFILE" ]; then
        echo "dead."
      else
        echo "stopped."
      fi
      ;;
    DEBIAN|*)
      printf "Checking status of $DESC: "
      pids=`query_pids "$DAEMON" "$PIDFILE"`
      rc=$?
      if [ $rc -eq 0 -a -n "$pids" ]; then
        echo "running."
        STATUS=0                        # LSB: program is running
      elif [ $rc -ne 0 -a -s "$PIDFILE" ]; then
        echo "dead."
        STATUS=1                        # LSB: program is dead & pidfile exists
      elif [ $rc -ne 0 ]; then
        echo "stopped."
        STATUS=3                        # LSB: program is not running
      else
        echo "unknown."
        STATUS=4                        # LSB: program status unknown
      fi
      ;;
  esac
}

query_pids ()
{
# Writes the matching PIDs to stdout.
# Returns 0 on success (ie, pids found).
##
  PROCNAME="$1"
  PIDFILE="$2"

  if type pgrep >/dev/null 2>&1; then
    pids=`pgrep -d ' ' -x "\`basename \"$PROCNAME\"\`" 2>/dev/null`
    rc=$?
  elif type pidof >/dev/null 2>&1; then
    pids=`pidof -o $$ -x "$PROCNAME" 2>/dev/null`
    rc=$?
  else
    pids=`(ps awx -o pid -o command || ps -e -f -o pid -o args) 2>/dev/null \
      | tail +2 | egrep "( |/)$PROCNAME( |$)" | grep -v egrep \
      | sed 's/ *\([0-9]*\).*/\1/' | sort -n | tr '\012' ' '`
    [ -n "$pids" ] && rc=0 || rc=1
  fi

  unset pids_running
  if [ -n "$pids" -a -r "$PIDFILE" ]; then
    read pid_line < "$PIDFILE"
    for pid in $pid_line; do
      expr -- "$pid" : '[0-9]*$' >/dev/null 2>&1 \
        && expr -- " $pids " : ".* $pid .*" >/dev/null 2>&1 \
        && pids_running="$pids_running $pid"
    done
    [ -n "$pids_running" ] && pids=$pids_running
  fi

  echo $pids
  return $rc
}

signal_process ()
{
# Returns 0 on success, 1 if kill failed, 2 if PROCNAME is not running.
##
  PROCNAME="$1"
  SIGNUM="$2"

  pids=`query_pids "$DAEMON" "$PIDFILE"`
  [ $? -ne 0 -o -z "$pids" ] && return 2

  kill ${SIGNUM:+"-$SIGNUM"} $pids >/dev/null 2>&1
  [ $? -ne 0 ] && return 1
  [ -n "$SIGNUM" ] && return 0

  pids=`query_pids "$DAEMON" "$PIDFILE"`
  [ $? -ne 0 -o -z "$pids" ] && return 0
  [ -z "$SIGTERM_TIMEOUT" ] && return 1

  sleep "$SIGTERM_TIMEOUT"
  kill -KILL $pids >/dev/null 2>&1
  pids=`query_pids "$DAEMON" "$PIDFILE"`
  [ $? -ne 0 -o -z "$pids" ] && return 0
  return 1
}

log_init ()
{
# Output informational message at beginning of action.
##
  MESSAGE="$1"
  PROCNAME="$2"

  case $SYSTEM in
    DEBIAN)
      if [ "$VERBOSE" != no ]; then
        if type log_daemon_msg >/dev/null 2>&1; then
          log_daemon_msg "$MESSAGE" "$PROCNAME"
        else
          printf "$MESSAGE: $PROCNAME"
        fi
      fi
      ;;
    REDHAT|SUSE|LSB|*)
      printf "$MESSAGE: $PROCNAME"
      ;;
  esac
}

log_fini ()
{
# Output informational/error message at end of action.
##
  STATUS="$1"
  ERRMSG="$2"

  case $SYSTEM in
    DEBIAN)
      if [ "$VERBOSE" != no ]; then
        if ( type log_end_msg && type log_failure_msg ) >/dev/null 2>&1; then
          log_end_msg "$STATUS"
          [ $STATUS -eq 0 -o -z "$ERRMSG" ] || log_failure_msg "$ERRMSG"
        else
          [ $STATUS -eq 0 ] && echo "." || echo " (failed)."
          [ $STATUS -eq 0 -o -z "$ERRMSG" ] || echo "$ERRMSG" >&2
        fi
      fi
      ;;
    REDHAT)
      echo
      ;;
    SUSE)
      [ $STATUS -eq 0 -o -z "$ERRMSG" ] || echo "$ERRMSG" >&2
      ;;
    LSB|*)
      [ $STATUS -eq 0 ] && echo "." || echo " (failed)."
      [ $STATUS -eq 0 -o -z "$ERRMSG" ] || echo "$ERRMSG" >&2
      ;;
  esac
}

###############################################################################

service_init "$@"

case "$1" in
  start)
    service_start
    ;;
  stop)
    service_stop
    ;;
  restart)
    service_restart
    ;;
  try-restart|condrestart)
    service_try_restart
    ;;
  reload)
    service_reload
    ;;
  force-reload)
    service_force_reload
    ;;
  status)
    service_status
    ;;
  *)
    echo "Usage: `basename \"$0\"`" \
      "(start|stop|restart|try-restart|reload|force-reload|status)" >&2
    exit 2                              # LSB: invalid or excess argument(s)
    ;;
esac

service_fini

<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[2]中关于scp命令出现Permission denied错误的解决方案。用户的问题是在使用scp将munge.key文件复制到repair5节点时遇到权限拒绝错误。 根据引用[1]和引用[2]的解决方案,我们可以归纳出以下原因和解决方法: 1. 目标目录在远程节点上对当前用户没有写权限。 2. 本地文件对当前用户没有读权限(但这里我们复制的是munge.key,通常位于/etc/munge/,需要root权限)。 因此,我们需要分步骤解决: 步骤1:确保本地文件可读(由于是敏感文件,我们不建议修改权限,而是使用sudo) 由于munge.key通常属于root,普通用户无法读取,所以我们应该使用sudo来提升权限进行复制。 步骤2:确保远程目标目录可写 我们需要在远程节点(repair5)上确保目标目录(例如/etc/munge/)对传输用户(可能是root或具有sudo权限的用户)有写权限。 具体操作: 方案A:使用sudo scp(需要设置sudo免密码,且远程节点允许root登录) 如果远程节点允许root用户通过ssh登录,我们可以尝试: sudo scp /etc/munge/munge.key root@repair5:/etc/munge/ 方案B:先复制到远程用户有权限的目录,再用sudo移动 步骤1:将文件复制到远程用户的家目录(或临时目录) scp /etc/munge/munge.key repair5_user@repair5:~/ # 这里需要repair5_user有家目录的写权限 步骤2:通过ssh登录到repair5,然后用sudo将文件移动到目标位置 ssh repair5_user@repair5 sudo mv ~/munge.key /etc/munge/ # 注意:这里需要repair5_user在repair5上有sudo权限 方案C:修改远程目录权限(不推荐,因为/etc/munge/目录通常权限为700,属主为munge) 如果一定要直接复制到目标目录,可以临时修改远程目录的权限(复制后恢复): 在repair5上执行: sudo chmod 755 /etc/munge/ 然后从本地执行: scp /etc/munge/munge.key repair5_user@repair5:/etc/munge/ # 此时需要repair5_user有权限进入/etc/munge/并写入 复制完成后,在repair5上恢复权限: sudo chmod 700 /etc/munge/ 但是,方案C会临时降低目录安全性,不推荐。 推荐方案B,因为它不需要修改敏感目录的权限,也不需要开启root的ssh登录。 详细步骤(方案B): 1. 在本地机器上,使用scp将munge.key复制到repair5的远程用户家目录(假设远程用户名为hadoop,但根据实际情况替换): sudo scp /etc/munge/munge.key hadoop@repair5:~/ 注意:这里使用sudo是因为本地文件/etc/munge/munge.key只有root可读。如果当前用户已经是root,则不需要sudo。 2. 登录到repair5节点,将文件移动到目标位置: ssh hadoop@repair5 sudo mv ~/munge.key /etc/munge/ # 输入hadoop用户的sudo密码 3. 在repair5上,确保文件权限正确: sudo chown munge:munge /etc/munge/munge.key sudo chmod 400 /etc/munge/munge.key 4. 重启repair5上的munge服务: sudo systemctl restart munge 注意:如果远程用户没有sudo权限,则需要联系管理员进行操作。 另外,引用[4]中提到的问题是关于/dev/null的权限问题,与当前问题无关。 因此,针对用户的具体问题(复制munge.key到repair5),我们推荐使用方案B。 如果用户希望一步到位,且配置了root的ssh密钥登录,则可以使用方案A(但通常出于安全考虑,不开启root的ssh登录): sudo scp /etc/munge/munge.key root@repair5:/etc/munge/ 但是,如果root登录被禁用,则方案A会失败。 总结:根据实际情况选择方案A或方案B。 相关问题: 1. 如何配置sudo免密码? 2. 如何设置SSH密钥登录? 3. 如何修复munge.key的权限? 4. 如何验证munge服务在集群中正常工作?</think>### 解决 scp 复制文件到远程节点时出现 "Permission denied" 错误 以下是完整的解决方案,分为本地端和远程端操作: --- #### 🔧 本地端操作 (Master节点) 1. **提升文件权限**(确保源文件可读): ```bash sudo chmod 644 /etc/munge/munge.key # 放宽权限 sudo chown $USER /etc/munge/munge.key # 临时变更所有者 ``` 2. **使用 `-p` 保留权限传输**: ```bash scp -p /etc/munge/munge.key repair5@repair5:/etc/munge/ ``` --- #### 🌐 远程端操作 (repair5节点) 1. **创建目标目录**(如果不存在): ```bash ssh repair5@repair5 sudo mkdir -p /etc/munge ``` 2. **设置目录权限**: ```bash sudo chmod 755 /etc/munge # 开放目录写入权限 sudo chown repair5 /etc/munge # 临时赋权给用户 ``` 3. **验证权限**: ```bash ls -ld /etc/munge # 应显示: drwxr-xr-x 2 repair5 root ... ``` --- #### ⚡ 最终传输命令 ```bash # 本地执行(使用完整路径) scp -rp /etc/munge/munge.key repair5@repair5:/etc/munge/ ``` > 📌 **关键提示**:传输完成后立即恢复安全权限: > ```bash > # 本地恢复 > sudo chmod 400 /etc/munge/munge.key > sudo chown munge:munge /etc/munge/munge.key > > # 远程恢复 > ssh repair5@repair5 > sudo chmod 400 /etc/munge/munge.key > sudo chown munge:munge /etc/munge/munge.key > sudo chmod 700 /etc/munge # 恢复目录安全权限 > ``` --- ### 替代解决方案(无需改权限) ```bash # 方法1:使用rsync保留权限 sudo rsync -avz -e ssh /etc/munge/munge.key repair5@repair5:/etc/munge/ # 方法2:通过临时目录中转 scp /etc/munge/munge.key repair5@repair5:/tmp/ ssh repair5@repair5 "sudo mv /tmp/munge.key /etc/munge/" ``` --- ### 根本原因分析 1. **权限层级问题**: - 本地用户无`/etc/munge/munge.key`读取权 - 远程用户无`/etc/munge/`写入权 - 文件所有者(root)与操作用户不匹配 2. **安全机制限制**: - `scp`默认使用当前用户权限 - 系统目录(/etc)需要sudo提权 - SELinux/apparmor可能拦截操作 --- ### 🔍 验证传输结果 ```bash ssh repair5@repair5 "ls -l /etc/munge/munge.key" # 正确输出:-r-------- 1 munge munge 1024 Jul 15 16:30 /etc/munge/munge.key ``` --- ### 📚 相关问题 1. 如何配置 SSH 免密登录实现无密码 scp 传输?[^2] 2. 修复 scp 报错 "lost connection" 的完整流程是什么? 3. 如何解决 rsync 同步文件时的 "permission denied" 错误?[^1] 4. 跨服务器传输大文件的最佳工具选择(scp/rsync/sftp)?[^3] > 引用来源: > [^1]: Linux 下 scp 传输的权限解决方案 > [^2]: SSH 密钥对配置实现免密操作 > [^3]: 远程文件传输工具对比指南
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值