shell点滴[转]

本文介绍了Shell的基本概念,包括Shell的类型、工作模式及其在操作系统中的角色。此外,还详细讲解了Bourne Shell的基础知识,如环境配置、选项设置、特殊字符的作用,以及如何管理和使用Shell变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[color=blue]1.什么是shell?[/color]
信息来源:cnhacker.com

操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
  shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
  Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。

交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

shell的类型
在UNIX中主要有两大类shell
Bourne shell (包括 sh, ksh, and bash)
Bourne shell ( sh)
Korn shell ( ksh)
Bourne Again shell ( bash)
POSIX shell ( sh)
C shell (包括 csh and tcsh)
C shell ( csh)
TENEX/TOPS C shell ( tcsh)

Bourne Shell
最初的UNIX shell是由Stephen R. Bourne于20世纪70年代中期在新泽西的AT&T贝尔实验室编写的,这就是Bourne shell。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。

C Shell
Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。

Korn Shell
有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。

Bourne Again Shell (bash)
bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat, Slackware, Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。

POSIX Shell
POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0 , POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.

各主要操作系统下缺省的shell:
AIX 下是Korn Shell.
Solaris和FreeBSD缺省的是Bourne shell.
HP-UX缺省的是POSIX shell.
Linux是Bourne Again shell.

shell是一个命令解析器,它解释用户输入的命令并且把它们送到系统的内核去执行。换句话说shell就是用户与操作系统对话的一个接口,我们发出一个命令,通过shell告诉系统让系统执行我们的命令。

黑客入侵时要得到的是有admin权限的shell这样才能完全的控制系统。
当你用溢出得到的shell就是拥有admin权限的shell这样在你的命令提示付后就会出现"c:\\documents and setting \\"
这和操作自己的机器没什么区别。

还有的就是有一些朋友错把ipc空连接当作得到目标机器的shell,因此对远端执行的命令没有反映,典型事例就是建立ipc$,然后用 net user xx xx /add????|????net localgroup administrators xx /add
之后当然是在自己机器上添加一个admin权限的用户

所以说学知识不能弄混,这时也许会有菜鸟问,那ipc$之后怎么能得到shell? 其实很简单,我习惯用winshell或开3389(开3389的东东很多建议用3389.bat),实在不行上传木马,之后想干什么就干什么!

[color=blue]2.SHELL基础:[/color]
[color=red]
版权声明:
  本文内容为大连理工大学LINUX选修课讲义,欢迎大家转载,但禁止使用本材料进行任何商业性或赢利性活动。转载时请保留本版权声明。
  作者:何斌武,hbwork@dlut.edu.cn,大连理工大学网络中心 
[/color]

  Bourne Shell
  介绍:Bourne Shell 基础及其他很多有用的特性,shell编程及组织。
  主要内容:
  .shell基础 基本介绍,环境,选项,特殊字符
  .shell变量 用户定义变量,环境变量,位置变量(shell 参数)
  .shell script编程
   条件测试,循环及重复控制
  .shell定制
  1.shell基础知识
   作者:Stephen Bourne 在Bell实验室开发
   建议:man sh 查看相关UNIX上的改进或特性
  (1)shell提示符及其环境
   /etc/passwd文件
   提示符:$
   /etc/profile $HOME/.profile
  (2)shell执行选项
   -n 测试shell script语法结构,只读取shell script但不执行
   -x 进入跟踪方式,显示所执行的每一条命令,用于调度
   -a Tag all variables for export
   -c "string" 从strings中读取命令
   -e 非交互方式
   -f 关闭shell文件名产生功能
   -h locate and remember functions as defind
   -i 交互方式
   -k 从环境变量中读取命令的参数
   -r 限制方式
   -s 从标准输入读取命令
   -t 执行命令后退出(shell exits)
   -u 在替换中如使用未定义变量为错误
   -v verbose,显示shell输入行
   这些选项可以联合使用,但有些显然相互冲突,如-e和-i.
  (3)受限制shell(Restircted Shell)
   sh -r 或 /bin/rsh
   不能执行如下操作:cd, 更改PATH,指定全路径名,输出重定向,因此可以提供一个较
   好的控制和安全机制。通常rsh用于应用型用户及拨号用户,这些用户通常是看不到提
   示符的。通常受限制用户的主目录是不可写的。
   不足:如果用户可以调用sh,则rsh的限制将不在起作用,事实上如果用户在vi及more
   程序中调用shell,而这时rsh的限制将不再起作用。
  (4)用set改变 shell选项
   用户可以在$提示符下用set命令来设置或取消shell的选项。使用-设置选项,+取消相应
   选项,大多数UNIX系统允许a,e,f,h,k,n,u,v和x的开关设置/取消。
   set -xv
   启动跟踪方式;显示所有的命令及替换,同样显示输入。
   set -tu
   关闭在替换时对未定义变量的检查。
   使用echo $-显示所有已设置的shell选项。
  (5)用户启动文件 .profile
  PATH=$PATH:/usr/loacl/bin; export PATH
  (6)shell环境变量
   CDPATH 用于cd命令的查找路径
   HOME /etc/passwd文件中列出的用户主目录
   IFS Internal Field Separator,默认为空格,tab及换行符
   MAIL /var/mail/$USERNAME mail等程序使用
   PATH
   PS1,PS2 默认提示符($)及换行提示符(> )
   TERM 终端类型,常用的有vt100,ansi,vt200,xterm等
   示例:$PS1="test:";export PS1
   test: PS1="\$";export PS1
   $echo $MAIL
   /var/mail/username
  (7)保留字符及其含义
   $ shell变量名的开始,如$var
   | 管道,将标准输出转到下一个命令的标准输入
   # 注释开始
   & 在后台执行一个进程
   ? 匹配一个字符
   * 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
   $- 使用set及执行时传递给shell的标志位
   $! 最后一个子进程的进程号
   $# 传递给shell script的参数个数
   $* 传递给shell script的参数
   $@ 所有参数,个别的用双引号括起来
   $? 上一个命令的返回代码
   $0 当前shell的名字
   $n (n:1-) 位置参数
   $$ 进程标识号(Process Identifier Number, PID)
   >file 输出重定向
      `command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`
   >>fiile 输出重定向,append
   转义符及单引号:
   $echo "$HOME $PATH"
   /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:
   $echo '$HOME $PATH'
   $HOME $PATH
   $echo \$HOME $PATH
  $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbw
  ork/bin
   其他:
   $dir=ls
   $$dir
   $alias dir ls
   $dir
   ls > filelist
   ls >> filelist
   wc -l < filelist
   wc -l filelist
   sleep 5; echo 5 seconds reaches; ls -l
   ps ax |egrep inetd
   find / -name core -exec rm {} \; &
   filename=`date "+%Y%m%d"`.log
  2. shell变量
   变量:代表某些值的符号,如$HOME,cd命令查找$HOME,在计算机语言中可以使用变量可以
   进行多种运算和控制。
   Bourne Shell有如下四种变量:
   .用户自定义变量
   .位置变量即 shell script之参数
   .预定义变量(特殊变量)
   .环境变量(参考shell定制部分)
   (1)用户自定义变量(数据的存储)
   $ COUNT=1
   $ NAME="He Binwu"
   技巧:因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,
   当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。
   变量的调用:在变量前加$
   $ echo $HOME
   /home/hbwork
   $ WEEK=Satur
   $ echo Today is $WEEKday
   Today is
   $echo Today is ${WEEK}day
   Today is Saturday
   Shell变量赋值从右从左进行(Linux Shell/bash从左向右赋值!)
   $ X=$Y Y=y
   $ echo $X
   y
   $ Z=z Y=$Z
   $ echo $Y
   $
   使用unset命令删除变量的赋值
   $ Z=hello
   $ echo $Z
   hello
   $ unset Z
   $ echo $Z
   $
   有条件的命令替换
   在Bourne Shell中可以使变量替换在特定条件下执行,即有条件的环境变量替换。
   这种变量替换总是用大括号括起来的。
   .设置变量的默认值
   在变量未赋值之前其值为空。Bourne Shell允许对变量设置默认值,其格式如
  下:
   ${variable:-defaultvalue}
   例:
   $ echo Hello $UNAME
   Hello
   $ echo Hello ${UNAME:-there}
   Hello there
   $ echo $UNAME #变量值并未发生变化
  
   $ UNAME=hbwork
   $ echo Hello ${UNAME:-there}
   Hello hbwork
   $
   .另一种情况:改变变量的值,格式如下:
  ${variable:=value}
   例:
   $ echo Hello $UNAME
   Hello
   $ echo Hello ${UNAME:=there}
   Hello there
   $ echo $UNAME #变量值并未发生变化
   there
   $
   .变量替换中使用命令替换
  $USERDIR=${$MYDIR:-`pwd`}
   .在变量已赋值时进行替换 ${variable:+value}
   .带有错误检查的有条件变量替换
   ${variable:?value}
   例:
   $ UNAME=
   $ echo ${UNAME:?"UNAME has not been set"}
   UNAME: UNAME has not been set
   $ echo ${UNAME:?}
   UNAME: parameter null or not set
   (2)位置变量(Shell参数)
   在shell script中位置参数可用$1..$9表示,$0表示内容通常为当前执行程序的文件名。
   .防止变量值被替换 readonly variable
   .使用export命令输出变量,使得变量对子shell可用,当shell执行一下程序时,shell将为其设置一个新的环境让其执行,这称
<think>好的,我现在需要帮用户解决在VMware中克隆其他用户的虚拟机或复制其配置的问题。首先,我得回忆一下VMware的克隆功能和相关步骤。根据用户提供的引用内容,有几个关键点需要注意: 用户提到的引用[1]和[2]都提到可以通过复制虚拟机文件到其他电脑,然后用VMware打开。但如果是克隆其他用户的虚拟机,可能需要访问他们的虚拟机文件。这时候需要考虑权限问题,用户是否有权访问对方的虚拟机存储目录。 然后引用[2]和[3]提到快照管理和克隆类型,比如完整克隆和链接克隆的区别。完整克隆独立,而链接克隆依赖源虚拟机。如果用户需要复制他人的配置,可能需要对方先创建快照,然后基于快照克隆,这样能保证一致性。 另外,引用[4]提到克隆Linux虚拟机后可能需要处理网络配置问题,比如删除70-persistent-net.rules文件,避免网卡冲突。这点在克隆后是必须的步骤,否则可能会遇到网络启动问题。 接下来,我需要整理步骤。首先,确保有权限访问对方的虚拟机文件。然后,让对方创建快照,这样克隆时状态稳定。之后使用VMware的克隆功能,选择完整克隆以避免依赖。最后处理克隆后的系统配置,特别是Linux的网卡UUID和主机名等。 可能的问题包括如何具体操作克隆功能,如何处理不同操作系统的配置,比如Windows和Linux的不同步骤。用户可能还需要知道如何传输虚拟机文件,或者是否有其他方法比如导出OVF模板。 需要确保步骤清晰,分点说明,同时提醒用户注意权限和配置调整,避免克隆后无法启动或出现网络问题。还要区分克隆自己虚拟机和其他用户虚拟机的不同之处,比如是否需要对方配合创建快照或提供文件访问。</think>在VMware中克隆其他用户的虚拟机或复制配置,需遵循以下步骤: ### 一、获取虚拟机文件权限 1. 若需克隆他人虚拟机,需先获取其虚拟机存储目录(包含`.vmx`配置文件、`.vmdk`虚拟磁盘文件等)的访问权限[^1] 2. 建议让原用户通过共享/传输完整虚拟机文件夹(如`.vmwarevm`扩展名的文件夹)实现文件级复制 ### 二、克隆虚拟机流程 1. **源虚拟机准备** - 要求原用户对虚拟机创建快照(保证克隆时系统状态稳定)[^2] - 关闭虚拟机电源(强制克隆可能引发文件损坏) 2. **克隆操作** - 右击虚拟机 → 选择"管理" → "克隆" - 选择克隆源:建议使用"当前状态"或指定快照 - 克隆类型: - **完整克隆**:生成独立新虚拟机(推荐用于跨用户使用)[^3] - 链接克隆:依赖源虚拟机文件(需保持原文件路径不变) ### 三、克隆后配置调整 1. **Windows系统** - 使用sysprep重置SID(系统唯一标识) - 修改计算机名和IP地址 2. **Linux系统**(以CentOS为例) ```bash sudo rm -f /etc/udev/rules.d/70-persistent-net.rules # 删除网卡UUID绑定[^4] sudo sed -i 's/HOSTNAME=.*/HOSTNAME=new_hostname/' /etc/sysconfig/network reboot ``` ### 四、替代方案:OVF模板 若无法直接访问虚拟机文件,可让原用户: 1. 通过"文件 → 导出为OVF"生成标准化模板 2. 将导出的`.ovf`+`.vmdk`文件包传输给您 3. 在本地VMware中直接导入使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值