设为首页 收藏本站
查看: 1064|回复: 0

SHELL实现跳板机

[复制链接]
YunVN网友  发表于 2018-8-30 06:31:48 |阅读模式
  # ~/virtual terminal
  # 将此文件放在/etc/profile.d/目录下,并添加可执行权限。
  # 如: -rwxr-xr-x 1 root root 7340 Oct 23 18:12 /etc/profile.d/vt.sh
  ############################################################################
  # 本行直至文件末尾的代码,用于实现用户登录使用的虚拟终端
  # 请勿删除或更改
  # 如有疑问、请联系维护负责人: xiaoxi227(QQ451914397)
  ############################################################################
  # 该文件存放用户名和密码 文件格式为==> 用户名:密码 (每行一个用户)
  passwd_file=/etc/user.password
  function red()
  {
  # 以红色显示
  echo -e "\033[31;40m$*\033[0m\n"
  }
  function green()
  {
  # 以绿色显示
  echo -e "\033[32;40m$*\033[0m\n"
  }
  # 忽略所有信号,以免用户使用Ctrl+C或者Ctrl+Z等操作退出Virtual Terminal(VT)
  for signal in `seq 1 64`
  do
  trap : $signal &> /dev/null
  done
  clear
  function getchar() # 关闭回显,用于输入密码
  {
  stty cbreak -echo
  dd if=/dev/tty bs=1 count=1 2>/dev/null
  stty -cbreak echo
  }
  ###############################################################################
  green "登录成功。" # 用户通过unix pam认证以后显示“登陆成功”,随后进行身份验证
  while :
  do
  read -p "请输入用户名:" username
  echo -n "请输入密码: "
  while :
  do
  ret=$(getchar)
  if [ x"$ret" = x"" ];then
  echo
  break
  fi
  passwd="$passwd$ret"
  echo -n '*'
  done
  correct_passwd=$(gawk -F: "/$username/{ print \$2 }" $passwd_file)
  if [ -z "$username" -o -z "$passwd" ];then
  clear
  red "用户名或密码不能为空"
  continue
  fi
  input_password=$(echo $passwd | md5sum | gawk '{ print $1 }')
  if [ x"$input_password" != x"$correct_passwd" ];then
  clear
  red "用户名或密码错误,请重新输入"
  else
  break
  fi
  done
  title="
  ##################################################################################
  ############################## Virtual Terminal ##################################
  ##################################################################################
  "
  cat | more  $logfile
  $command
  }
  # 通常开发人员需要部署的程序都在同一目录下,所以为其指定根目录,限定仅在该目录有权限。
  ROOT_DIR=/usr # 本例中用/usr目录测试
  cd $ROOT_DIR  # 进入用户的“根目录”
  while :  # 死循环读取用户输入
  do
  # 这里的主机名写成“localhost”写死了,您也可以写成$HOSTNAME,这样就会显示主机名了。
  read -e -p "[${username}localhost ${PWD##*/}]$ "REPLY
  # 如上语句模拟产生shell提示符(其实是假的)
  # 分隔命令和参数
  COMMAND=$(echo $REPLY | gawk '{ print $1 }')
  OPTION=$(echo $REPLY | sed -r "s/^$COMMAND//g;s/^[[:space:]]+//g")
  # 判断要执行的命令是什么,根据不同命令设置不同的动作。如下是本例中实现的几个命令:
  case $COMMAND in
  cd|ls)
  # 当执行cd命令且参数为空时,默认cd到根目录,行为要与系统中的cd命令保持一致。
  if [ x"$OPTION" = x"" -a x"$COMMAND" = x"cd" ];then
  cd $ROOT_DIR
  continue
  fi
  # 判断参数的第一个字符是不是"/",如果不是,说明想要cd或ls的是相对路径。
  # 也就是当前目录下的文件活目录,此时用户是有权限的。
  first_char=${OPTION:0:1}
  if [ x"$first_char" != x"/" ];then
  run $REPLY
  else
  # 如果是绝对路径,那么判断路径是否以$ROOT_DIR开头,若否则提示用户没权限。
  echo $OPTION | grep -q ^$ROOT_DIR
  if [ $? -eq 0 ];then
  run $REPLY
  else
  echo "$COMMAND: Permission denied." >&2
  fi
  fi
  ;;
  # 其他支持的参数:rm、mv、pwd、passwd等等,就不写注释了,自己理解下吧。
  rm|mv)
  if [ x"$COMMAND" = x"rm" ];then RM='-rf';else RM='';fi
  run='ok'
  for _file in $OPTION
  do
  echo $_file | grep -q '-'
  [ $? -eq 0 ] && {
  red "本命令在VT模式下不支持参数";
  continue;
  }
  echo $_file | grep -q ^$ROOT_DIR
  ret=$?
  first_char=${_file:0:1}
  if [ x"$first_char" = x"/" ];then
  if [ $ret -ne 0 ];then
  run='not ok'
  fi
  fi
  done
  if [ x"$run" = x"ok" ];then
  run $COMMAND $RM $OPTION
  else
  echo "$COMMAND: Permission denied." >&2
  fi
  ;;
  pwd)
  run $REPLY
  ;;
  upload)
  run rz
  ;;
  download)
  for _file in $OPTION
  do
  if [ ! -d $_file ];then
  echo "开始下载文件:$_file"
  run sz $_file
  [ $? -eq 0 ] && green "下载完成" || red "下载失败"
  else
  echo "${_file}是目录,正在将其打包成${_file}.tar"
  tar -cf ${_file}.tar $_file
  [ $? -eq 0 ] && green "打包完成,开始下载${_file}.tar" \
  || { red "打包失败,无法下载";continue; }
  run sz ${_file}.tar
  [ $? -eq 0 ] && {
  green "下载完成"
  echo "正在删除打包文件"
  rm -rf ${_file}.tar
  [ $? -eq 0 ] && green "删除成功" \
  || red "删除失败"
  } || red "下载失败"
  fi
  done
  ;;
  passwd)
  read -e -s -p "请输入旧密码:" old_passwd
  echo '******'
  old_passwd=$(echo $old_passwd | md5sum | gawk '{ print $1 }')
  if [ x"$old_passwd" != x"$correct_passwd" ];then
  red "密码输入错误"
  continue
  else
  read -e -s -p "请输入新密码:" new_passwd1
  echo '******'
  read -e -s -p "请重复新密码:" new_passwd2
  echo '******'
  if [ x"$new_passwd1" != x"$new_passwd2" ];then
  red "两次输入的密码不一致"
  continue
  else
  new_passwd=$(echo $new_passwd1 | md5sum | gawk '{ print $1 }')
  sed -i "/$username/s/.*/$username:$new_passwd/g" $passwd_file
  fi
  fi
  ;;
  "")
  continue
  ;;
  *)
  echo "-bash: $COMMAND: command not found" >&2
  ;;
  esac
  done


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558571-1-1.html 上篇帖子: linux 之shell脚本练习 下篇帖子: shell脚本学习笔记系列--1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表