ice for linux linux if
linux 远程登录工具哪个好
在我们日常管理与维护服务器个过程中,我们都需要使用远程连接工具,今天我们就一同来总结下Linux常用的安全远程连接工具-OpenSSH。
【远程登录协议】
1、telnet:是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主
机工作的能力。默认使用的是TCP的23号端口,采用C/S架构,在用户登录的过程中传输的信息都是明文信息,安全无法保障,所以不建议用telnet。
2、ssh:为Secure Shell的缩写,由IETF的网络工作小组所制定;SSH
为建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH
协议可以有效防止远程管理过程中的信息泄露问题。默认使用的是TCP的22号端口,也是基于C/S架构,SSH有两个版本v1与v2。
sshv1:基于CRC-32做MAC(消息摘要认证),不安全,强烈建议不使用;
sshv2:基于双方主机的协商选择使用最安全的MAC方式,其有如下特点:1、加密机制及MAC机制由双方协商选定;2、基于DH实现密钥交换,基于RSA或DSA实现身份认证;3、客户端通过检查服务器端的主机密钥来判断是否能够继续通信;
【OpenSSH简述】
OpenSSH是一组用于安全地访问远程计算机的连接工具。它可以作为rlogin、rsh
rcp以及telnet的直接替代品使用。更进一步,其他任何TCP/IP连接都可以通过SSH安全地进行隧道/转发。OpenSSH
对所有的传输进行加密,从而有效地阻止了窃听、连接劫持,以及其他网络级的攻击。OpenSSH由 OpenBSD project维护。
登录过程和使用rlogin或telnet建立的会话非常类似。在连接时,SSH
会利用一个密钥指纹系统来验证服务器的真实性。只有在第一次连接时,用户会被要求输入yes进行确认,之后的连接将会验证预先保存下来的密钥指纹。如果保
存的指纹与登录时接收到的不符,则将会给出警告。指纹保存在~/.ssh/known_hosts中,对于SSHv2指纹,则是
~/.ssh/known_hosts2。
默认情况下,较新版本的OpenSSH只接受SSHv2连接。如果能用版本2则客户程序会自动使用,否则它会返回使用版本1的模式。此外,也可以通
过命令行参数-1或-2来相应地强制使用版本1或2。保持客户端的版本1能力是为了考虑较早版本的兼容性,建议尽量使用版本2。
【SSH服务器和客户端工作流程】
OpenSSH使用C/S架构:
服务端工具(S):sshd
客户端工具(C):ssh命令、putty、xshell、securecrt、sshshellclient;
【OpenSSH客户端组件-ssh】
配置文本:/etc/ssh/ssh_config
使用方法:
ssh [username@] host [COMMAND]或 ssh-l username host [COMMAND]
-p PORT:指定远程服务器端口;
-l username:指定登录远程主机的用户,不指定则使用当前用户;
username@:等同于-l username;
如果设置了COMMAND,表示使用username账户登录远程主机执行一次指定的命令并返回结果,不会停留在远程主机上;
[root@www~]# ssh 192.168.0.110#使用root用户登录;
The authenticity of host'192.168.0.110(192.168.0.110)' can't be established.
RSA key fingerprint is 01:2e:43:cc:bc:1d:f1:e5:f0:f4:89:78:74:a9:49:44.
Are you sure you want to continue connecting(yes/no)? yes#第一次连接,需手动进行确认;
Warning: Permanently added'192.168.0.110'(RSA) to the list of known hosts.
root@192.168.0.110's password:#输入远程主机root账户的密码;
Last login: Mon May 11 16:44:52 2015 from 192.168.0.104
[root@mailCentOS6~]##登录成功了,远程主机名为mailCentOS6;
[root@mailCentOS6~]# ls#显示远程主机root家目录下的文件;
2.sh boot.iso install.log sdb.mbr test1
anaconda-ks.cfg crontab install.log.syslog\temp\test
[root@mailCentOS6~]# exit#退出登录;
logout
Connection to 192.168.0.110 closed.
[root@www~]# ssh root@192.168.0.110 ls#使用root登录远程主机,执行一次ls命令,返回结果便退出;
root@192.168.0.110's password:#第二次连接,就不需要输入yes了,直接输入密码即可;
2.sh
anaconda-ks.cfg
boot.iso
crontab
install.log
install.log.syslog
sdb.mbr
\temp\test
test1
[root@www~]##看到了吗,我们当前并没有登录在远程主机;
【OpenSSH服务器端组件-sshd】
配置文件:/etc/ssh/sshd_config(通过修改此文件可以修改ssh的默认监听端口与其他参数)
服务脚本:/etc/rc.d/init.d/sshd
服务启动|停止|重启:serveice sshd start|stop|restart
脚本配置文件:/etc/sysconfig/sshd
配置参数
# man sshd_config查看配置参数的说明;
# vim/etc/sysconfig/sshd通过编辑配置文件来修改配置参数;
#+空格+文字:以此格式开头的行表示改行为注释说明;
#+文字:以此格式开头的行表示可启用选项,不改变则表示使用该选项的默认设置,反之使用设定值“#”要去掉哦!
例:#Port 22如不去掉#且22不变,表示使用默认的22号端口;
若把#Port 22改成port 7777,表示把sshd的监听端口改成7777;
注意:修改参数与配置后,必须重启服务(service sshd restart).
经常需要修改的参数:
[root@www~]# cat/etc/ssh/sshd_config
#$OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp$
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
#Port 22#修改默认监听的端口;
port 7777#把sshd的监听端口改成7777;
#AddressFamily any#监听的地址家族,指定是监听在IPV4上还是IPV6上,any表示所有;
#ListenAddress 0.0.0.0#指定监听的地址(0.0.0.0表示本机的所有地址);
#ListenAddress::
# Disable legacy(protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2
# HostKey for protocol version 1
#HostKey/etc/ssh/ssh_host_key#使用shhv1用到的主机密钥;
# HostKeys for protocol version 2
#HostKey/etc/ssh/ssh_host_rsa_key
#HostKey/etc/ssh/ssh_host_dsa_key
# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024#密钥长度;
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m#登录宽限期;
#PermitRootLogin yes#是否允许管理员直接登录;
#StrictModes yes
#MaxAuthTries 6#最大密码输入错误次数;
#MaxSessions 10#最大会话个数;
#RSAAuthentication yes#是否允许使用RSA机制来认证;
#PubkeyAuthentication yes
#--------中间不长改变的配置参数略----------
Subsystem sftp/usr/libexec/openssh/sftp-server#表示是否启动sftp功能;
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# ForceCommand cvs server
sshd认证方式:
1、基于口令的认证;
2、基于密钥的认证;
# ssh-keygen-t rsa用rsa算法生成密钥,默认密钥为id_rsa(私钥), id_rsa.pub(公钥)
# ssh-keygen-f/path/to/somefile-P oldpassword根据现有的密钥文件生成密钥
-f/path/to/somefile:密钥文件保存在的位置;
-P'':指定生成旧密钥时使用的密码;
方法一:把本地主机生成的公钥 id_rsa.pub使用scp复制到远程主机的上,在远程主机使用cat id_rsa.pub>>.ssh/authorized_keys追加该公钥信息,这样就可以实现基于密钥认证的ssh登录;
方法二:# ssh-copy-id-i.ssh/id_rsa.pub USERNAME@HOST
[root@www~]# ssh-keygen-t rsa#用rsa算法生成密钥;
Generating public/private rsa key pair.
Enter file in which to save the key(/root/.ssh/id_rsa):#指定密钥存放路径及名称,一般不用
#修改,直接回车;
Enter passphrase(empty for no passphrase):#输入私钥密码;
Enter same passphrase again:#确认输入私钥密码;
Your identification has been saved in/root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
c2:f9:c2:3d:4d:ca:52:39:7a:a7:33:de:42:11:d3:8f root@www.99.com
The key's randomart image is:
+--[ RSA 2048]----+
|.|
| o.|
| o o|
|....E.|
|+ S..|
|. B.=|
|=.B o|
|++=|
|.o+.|
+-----------------+
[root@www~]# ssh-keygen-f.ssh/id_rsa-P''#根据现有密钥文件重新生成密钥;
Generating public/private rsa key pair.
.ssh/id_rsa already exists.
Overwrite(y/n)? y#提示是否确定要覆盖;
Your identification has been saved in.ssh/id_rsa.
Your public key has been saved in.ssh/id_rsa.pub.
The key fingerprint is:
bf:55:f0:0b:a5:ee:4e:4a:1d:d3:b1:0e:66:ee:55:9b root@www.99.com
The key's randomart image is:
+--[ RSA 2048]----+
||
||
|. o|
|* o|
| S O=.|
|.* B oo|
| o*+E|
|. B.|
| o.+|
+-----------------+
#-----使用方法一:实现通过密钥文件完成身份验证(不需要输入密码)-----
[root@www~]# scp.ssh/id_rsa.pub root@192.168.0.110:/root/#使用spc命令复制公钥文件到远程
#主机的用户家目录下的.ss/路径下;
root@192.168.0.110's password:#输入登录远程主机的密码;
id_rsa.pub 100% 397 0.4KB/s 00:00#提示复制成功;
[root@mailCentOS6~]# ls.ssh/#验证确认文件复制成功;
id_rsa.pub known_hosts
[root@mailCentOS6~]# touch.ssh/authorized_keys#路径内没有自动验证密钥文件,创建一个;
[root@mailCentOS6~]# cat.ssh/id_rsa.pub>>.ssh/authorized_keys#把公钥追加到自动验证密钥文件;
[root@www~]# ssh 192.168.0.110
Last login: Mon May 11 20:45:10 2015 from 192.168.0.111
[root@mailCentOS6~]##OK了,看到了没有,不用输入密码我们就直接可以远程登录了!!
#-----使用方法二:实现通过密钥文件完成身份验证(不需要输入密码)-----
[root@mailCentOS6~]# rm-f.ssh/authorized_keys#删除原有保存的自动验证密钥文件;
[root@www~]# ssh-copy-id-i.ssh/id_rsa.pub root@192.168.0.110#使用命令自动传输生成自动验证密钥文件;
root@192.168.0.110's password:
Now try logging into the machine, with"ssh'root@192.168.0.110'", and check in:
.ssh/authorized_keys#提示生成的文件;
to make sure we haven't added extra keys that you weren't expecting.
[root@www~]# ssh 192.168.0.110#验证看看是否可以登录;
Last login: Mon May 11 21:02:29 2015 from 192.168.0.111
[root@mailCentOS6~]# ls.ssh/#看到了没有,我们现在已经登录到了mailCentOS6这台主机上了;
authorized_keys known_hosts
【命令补充】
scp:利用ssh协议在主机之间实现安全文件传输的工具
scp SRC1... DEST
分两种情形:
1、源文件在本机,目标为远程主机
# scp/path/to/somefile... USERNAME@HOST:/path/to/somewhere
源可以是目录或文件有多个,目标必须是目录
2、源文件在远程,本地为目标
# scp USERNAME@HOST:/path/to/somewhere/path/to/somewhere
-r:复制目录时使用(实现递归复制),scp默认不能复制目录;
-p:保持源文件的元数据信息,包括mode和timestamp
-q:静默模式,复制过程不显示状态信息;
-p PORT:指定ssh协议监听的端口(远程主机)。
linux shell 怎么写
在进行linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入
./smartzip就能运行脚本了。。
每行命令开头处不用就空格也行。。
第1部分. Linux脚本编写基础
1.1语法基本介绍
1.1.1开头
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
编译 chmod+x filename这样才能用./filename来运行
1.1.2注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。
如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
1.1.3变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
#!/bin/sh
#对变量赋值:
a="hello world"
#现在打印变量a的内容:
echo"A is:"
echo$a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo"this is the$numnd"
这并不会打印出"this is the 2nd",而仅仅打印"this is the",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2
echo"this is the${num}nd"
这将打印: this is the 2nd
1.1.4环境变量
由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
1.1.5 Shell命令和流程控制
在shell脚本中可以使用三类命令:
1)Unix命令:
虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo"some text":将文字内容打印在屏幕上
ls:文件列表
wc–l file:计算文件行数
wc-w file:计算文件中的单词数
wc-c file:计算文件中的字符数
cp sourcefile destfile:文件拷贝
mv oldname newname:重命名文件或移动文件
rm file:删除文件
grep'pattern' file:在文件内搜索字符串比如:grep'searchstring' file.txt
cut-b colnum file:指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut-b5-9 file.txt千万不要和cat命令混淆,
这是两个完全不同的命令
cat file.txt:输出文件内容到标准输出设备(屏幕)上
file somefile:得到文件类型
read var:提示用户输入,并将输入赋值给变量
sort file.txt:对file.txt文件中的行进行排序
uniq:删除文本文件中出现的行列比如: sort file.txt| uniq
expr:进行数学运算Example: add 2 and 3expr 2"+" 3
find:搜索文件比如:根据文件名搜索find.-name filename-print
tee:将数据输出到标准输出设备(屏幕)和文件比如:somecommand| tee outfile
basename file:返回不包含路径的文件名比如: basename/bin/tux将返回 tux
dirname file:返回文件所在路径比如:dirname/bin/tux将返回/bin
head file:打印文本文件开头几行
tail file:打印文本文件末尾几行
sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将
结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为LinuxFocus:cat text.file| sed's/linuxfocus/LinuxFocus/'> newtext.fileawk: awk用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
cat file.txt| awk-F,'{print$1","$3}'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
2)概念:管道,重定向和backtick
这些不是系统命令,但是他们真的很重要。
管道(|)将一个命令的输出作为另外一个命令的输入。
grep"hello" file.txt| wc-l
在file.txt中搜索包含有”hello”的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
>写入文件并覆盖旧文件
>>加到文件的尾部,保留旧文件内容。
反短斜线
使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
命令:
find.-mtime-1-type f-print
用来查找过去24小时(-mtime–2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks(`) not normal quotes('):
tar-zcvf lastmod.tar.gz `find.-mtime-1-type f-print`
3)流程控制
1.if
"if"表达式如果条件为真则执行then后面的部分:
if....; then
....
elif....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
通常用" [ ]"来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[-f"somefile" ]:判断是否是一个文件
[-x"/bin/ls" ]:判断/bin/ls是否存在并有可执行权限
[-n"$var" ]:判断$var变量是否有值
["$a"="$b" ]:判断$a和$b是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:
#!/bin/sh
if ["$SHELL"="/bin/bash" ]; then
echo"your login shell is the bash(bourne again shell)"
else
echo"your login shell is not bash but$SHELL"
fi
变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
快捷操作符
熟悉C语言的朋友可能会很喜欢下面的表达式:
[-f"/etc/shadow" ]&& echo"This computer uses shadow passwors"
这里&&就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。
您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[-r"$mailfolder" ]''{ echo"Can not read$mailfolder"; exit 1;}
echo"$mailfolder has mail from:"
grep"^From"$mailfolder
该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From"一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
-打印错误信息
-退出程序
我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。
2.case
case:表达式可以用来匹配一个给定的字符串,而不是数字。
case... in
...) do something here;;
esac
让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
file lf.gz
这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip类型的压缩文件:
#!/bin/sh
ftype=`file"$1"`
case"$ftype" in
"$1: Zip archive"*)
unzip"$1";;
"$1: gzip compressed"*)
gunzip"$1";;
"$1: bzip2 compressed"*)
bunzip2"$1";;
*) echo"File$1 can not be uncompressed with smartzip";;
esac
您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。
也就是说,当我们运行:
smartzip articles.zip
$1就是字符串 articles.zip
3. selsect
select表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
select var in...; do
break
done
.... now$var can be used....
下面是一个例子:
#!/bin/sh
echo"What is your favourite OS?"
select var in"Linux""Gnu Hurd""Free BSD""Other"; do
break
done
echo"You have selected$var"
下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop
loop表达式:
while...; do
....
done
while-loop将运行直到表达式测试为真。will run while the expression that we test for is true.
关键字"break"用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
for-loop表达式查看一个字符串列表(字符串用空格分隔)然后将其赋给一个变量:
for var in....; do
....
done
在下面的例子中,将分别打印ABC到屏幕上:
#!/bin/sh
for var in A B C; do
echo"var is$var"
done
下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2...
# EXAMPLE: showrpm/cdrom/RedHat/RPMS/*.rpm
for rpmpackage in$*; do
if [-r"$rpmpackage" ];then
echo"===============$rpmpackage=============="
rpm-qi-p$rpmpackage
else
echo"ERROR: cannot read file$rpmpackage"
fi
done
这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。
如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时$*包含了 3个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
5.引号
在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg和tux.jpg。
1.2编译SHELL脚本
#ch#!/bin/sh mod+x filename
cho*.jpg∪缓螅梢酝ü淙耄?./filename来执行您的脚本。
这将打印出"mail.jpg tux.jpg"的结果。
引号(单引号和双引号)将防止这种通配符扩展:
#!/bin/sh
echo"*.jpg"
echo'*.jpg'
这将打印"*.jpg"两次。
单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
#!/bin/sh
echo$SHELL
echo"$SHELL"
echo'$SHELL'
运行结果为:
/bin/bash
/bin/bash
$SHELL
最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
echo/*.jpg
echo/$SHELL
这将输出:
*.jpg
$SHELL
6. Here documents
当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。一个"Here document"以
here document就是一段特殊目的的代码块.他使用I/O重定向的形式来将一个命令序列传递到一个交互程序或者命令中,比如ftp, cat,或者ex文本编辑器.
1 COMMAND
limit string用来划定命令序列的范围(译者注:两个相同的limit string之间就是命令序列).特殊符号
而here document的形式看上去是如下的样子:
1#!/bin/bash
2 interactive-program
选择一个名字非常诡异的limit string将会避免命令列表和limit string重名的问题.
下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [$#-lt 3 ]; then
cat
4)函数
如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
functionname()
{
# inside the body$1 is the first argument given to the function
#$2 the second...
body
}
您需要在每个程序的开始对函数进行声明。
下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat shift by 2
--) shift;break;;# end of options
-*) echo"error: no such option$1.-h for help";exit 1;;
*) break;;
esac
done
echo"opt_f is$opt_f"
echo"opt_l is$opt_l"
echo"first arg is$1"
echo"2nd arg is$2"
您可以这样运行该脚本:
cmdparser-l hello-f---somefile1 somefile2
返回的结果是:
opt_f is 1
opt_l is hello
first arg is-somefile1
2nd arg is somefile2
这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.
第2部分实例
现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
然后再插入自己的函数。
让我们再看两个例子:
(1)二进制到十进制的转换
脚本 b2d将二进制数(比如 1101)转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
第3部分:调试
最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
shell也有一个真实的调试模式。如果在脚本"strangescript"中有错误,您可以这样来进行调试:
sh-x strangescript
这将执行该脚本并显示所有变量的值。
shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
sh-n your_script
这将返回所有语法错误
调试shell程序过程
用户刚编写完Shell程序中,不可避免的会有错误,这时我们可以利用Bsh中提供的跟踪选项,该选项会显示刚刚执行的命令及参数。用户可以通过set命令打开-x选项或在启动Shell使用-x选项将Shell设置成跟踪模式。例如有下面代码ice_tx:
if [$#-eq 0 ]
then
echo"usage:sumints integer list"
exit 1
fi
sum=0
until [$#-eq 0 ]
do
sum='expr$sum+$1'
shift
done
echo$sum
我们用跟踪模式运行:
$sh-x ice_tx 2 3 4
结果显示:
+[ 3-eq 0 ]
+sum=0
+[ 3-eq 0 ]
+expr 0+2
+sum=2
+shift
+[ 2-eq 0 ]
+expr 2+3
+sum=5
+shift
+[ 1-eq 0 ]
+expr 5+4
+sum=9
+[ 0-eq 0 ]
+echo 9
9
从上面可以看出,跟踪模式下Shell显示执行的每一条命令以及该命令使用的变量替换后的参数值。一些控制字如if、then、until等没显示。
linux怎么查看用户组里有哪些用户
groups查看当前登录用户的组内成员
groupsgliethttp查看gliethttp用户所在的组,以及组内成员
whoami查看当前登录用户名
/etc/group文件包含所有组
/etc/shadow和/etc/passwd系统存在的所有用户名
1、/etc/group解说;
/etc/group文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的;
用户组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去,
2、/etc/group内容具体分析
/etc/group的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;格式如下:
group_name:passwd:GID:user_list
在/etc/group中的每条记录分四个字段:
第一字段:用户组名称;
第二字段:用户组密码;
第三字段:GID
第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
三、用户(user)和用户组(group)相关的配置文件、命令或目录;
1、与用户(user)和用户组(group)相关的配置文件;
1)与用户(user)相关的配置文件;
/etc/passwd注:用户(user)的配置文件;
/etc/shadow注:用户(user)影子口令文件;
2)与用户组(group)相关的配置文件;
/etc/group注:用户组(group)配置文件;
/etc/gshadow注:用户组(group)的影子文件;
2、管理用户(user)和用户组(group)的相关工具或命令;
1)管理用户(user)的工具或命令;
useradd注:添加用户
adduser注:添加用户
passwd注:为用户设置密码
usermod注:修改用户命令,可以通过usermod来修改登录名、用户的家目录等等;
pwcov注:同步用户从/etc/passwd到/etc/shadow
pwck注:pwck是校验用户配置文件/etc/passwd和/etc/shadow文件内容是否合法或完整;
pwunconv注:是pwcov的立逆向操作,是从/etc/shadow和/etc/passwd创建/etc/passwd,然后会删除/etc/shadow文件;
finger注:查看用户信息工具id注:查看用户的UID、GID及所归属的用户组chfn注:更改用户信息工具
su注:用户切换工具sudo注:sudo是通过另一个用户来执行命令(executeacommandasanotheruser),su是用来切换用户,然后通过切换到的用户来完成相应的任务,
但sudo能后面直接执行命令,比如sudo不需要root密码就可以执行root赋与的执行只有root才能执行相应的命令;但得通过visudo来编辑/etc/sudoers来实现;
visudo注:visodo是编辑/etc/sudoers的命令;也可以不用这个命令,直接用vi来编辑/etc/sudoers的效果是一样的;
sudoedit注:和sudo功能差不多;
2)管理用户组(group)的工具或命令;
groupadd注:添加用户组;
groupdel注:删除用户组;
groupmod注:修改用户组信息
groups注:显示用户所属的用户组
grpckgrpconv注:通过/etc/group和/etc/gshadow的文件内容来同步或创建/etc/gshadow,如果/etc/gshadow不存在则创建;
grpunconv注:通过/etc/group和/etc/gshadow文件内容来同步或创建/etc/group,然后删除gshadow文件;
4、/etc/login.defs配置文件;
/etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的;
比如Fedora的/etc/logins.defs文件内容;
#*REQUIRED*#Directorywheremailboxesreside,_or_nameoffile,relativetothe#homedirectory.Ifyou_do_defineboth,MAIL_DIRtakesprecedence.
#QMAIL_DIRisforQmail
##QMAIL_DIRMaildirMAIL_DIR/var/spool/mail注:创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;#MAIL_FILE.mail
#Passwordagingcontrols:#
#PASS_MAX_DAYSMaximumnumberofdaysapasswordmaybeused.
#PASS_MIN_DAYSMinimumnumberofdaysallowedbetweenpasswordchanges.
#PASS_MIN_LENMinimumacceptablepasswordlength.
#PASS_WARN_AGENumberofdayswarninggivenbeforeapasswordexpires.
#PASS_MAX_DAYS99999注:用户的密码不过期最多的天数;
PASS_MIN_DAYS0注:密码修改之间最小的天数;
PASS_MIN_LEN5注:密码最小长度;
PASS_WARN_AGE7注:#
#Min/maxvaluesforautomaticuidselectioninuseradd
#UID_MIN500注:最小UID为500,也就是说添加用户时,UID是从500开始的;UID_MAX60000注:最大UID为60000;#
#Min/maxvaluesforautomaticgidselectioningroupadd#GID_MIN500注:GID是从500开始;GID_MAX60000#
#Ifdefined,thiscommandisrunwhenremovingauser.
#Itshouldremoveanyat/cron/printjobsetc.ownedby
#theusertoberemoved(passedasthefirstargument).#
#USERDEL_CMD/usr/sbin/userdel_local#
#Ifuseraddshouldcreatehomedirectoriesforusersbydefault
#OnRHsystems,wedo.ThisoptionisORedwiththe-mflagon
#useraddcommandline
.#CREATE_HOMEyes注:是否创用户家目录,要求创建;
5、/etc/default/useradd文件;
通过useradd添加用户时的规则文件;
#useradddefaultsfile
GROUP=100
HOME=/home注:把用户的家目录建在/home中;
INACTIVE=-1注:是否启用帐号过期停权,-1表示不启用;
EXPIRE=注:帐号终止日期,不设置表示不启用;
SHELL=/bin/bash注:所用SHELL的类型;
SKEL=/etc/skel注:默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;
后记:
关于用户(user)和用户组(group)管理内容大约就是这么多;只要把上面所说的内容了解和掌握,用户(user)和用户组(group)管理就差不多了;由于用户(user)和用户组(group)是和文件及目录权限联系在一起的,所以文件及目录权限的操作也会独立成文来给大家介绍;
本文只是让新手弟兄明白用户(user)和用户组(group)一些原理,所以我在写此文的时候,大多是解说内容,我的意思是通过解说和索引一些命令,让新手弟兄明白一点理论是比较重要的,技术操作无非是命令的用法;
linux的用户信息保存在/etc/passwd文件中,另外,/etc/shadow文件存放的是用户密码相关信息。
/etc/passwd文件格式:
用户名:密码:UID:GID:用户信息:HOME目录路径:用户shell
其中UID为0则是用户root,1~499为系统用户,500以上为普通用户
/etc/shadow保存用户密码信息,包括加密后的密码,密码过期时间,密码过期提示天数等。
用户组信息保存在/etc/group文件中.
格式如下:
用户组名:组密码:GID:组内帐号(多个帐号用逗号分隔)
用户登录后,/etc/passwd文件里的GID为用户的初始用户组。
用户的初始用户组这一事实不会再/etc/group中体现。
新建用户命令:
[root@localopt]#useradd用户名-g初始用户组-G其他用户组(修改/etc/group)-c用户说明-u指定UID
建完用户需要为用户设置密码:
[root@localopt]#passwd用户名
用户要修改自己密码命令:
[root@localopt]#passwd
修改用户信息命令:
[root@localopt]#usermod参数用户名
参数:
-c说明
-g组名初始用户组
-e过期日期格式:YYYY-MM-DD
-G组名其他用户组
-l修改用户名
-L锁定账号(在/etc/shadow文件中用户对应密码密码串的前面加上两个叹号(!!))
-U解锁
删除用户命令:
[root@localopt]#userdel[-r]用户名
其中,参数-r为删除用户的home目录。
其实,可能在系统其他地方也有该用户文件,要完整删除一个用户和其文件要先找到属于他的文件:
[root@localopt]#find/-user用户名
然后删除,再运行userdel删除用户。
查看可用shell命令:
[root@localopt]#chsh-l
修改自己的shell命令:
[root@localopt]#chsh-s
查看自己或某人UID/GID信息:
[root@localopt]#id[用户名]
返回信息中groups为有效用户组
新增用户组命令:
[root@localopt]#groupadd用户组名
修改用户组名命令:
[root@localopt]#groupmod-n名称
删除用户组命令:
[root@localopt]#groupdel用户组名
设置用户组密码命令:
[root@localopt]#gpasswd用户组名
如果gpasswd加上参数则有其他功能
设置用户组管理员命令:
[root@localopt]#gpasswd-A用户名用户组名
添加某帐号到组命令:
[root@localopt]#gpasswd-M用户名用户组名
从组中删除某帐号命令:
[root@localopt]#gpasswd-d用户名用户组名
passwd相关参数操作:
-l锁用户
-u解锁用户
-n天数密码不可改天数
-x天数密码过期天数
-w天数警告天数
文件权限知识
先看个实例:
[root@localopt]#ls-al
ls-al命令是列出目录的所有文件,包括隐藏文件。隐藏文件的文件名第一个字符为'.'
-rw-r--r--1rootroot8108-0214:54gtkrc-1.2-gnome2
-rw-------1rootroot18908-0214:54ICEauthority
-rw-------1rootroot3508-0510:02.lesshst
drwx------3rootroot409608-0214:54.metacity
drwxr-xr-x3rootroot409608-0214:54nautilus
列表的列定义如下:
[权限属性信息][连接数][拥有者][拥有者所属用户组][大小][最后修改时间][文件名]
权限属性列表为10个字符:
第一个字符表示文件类型,d为目录-为普通文件l为连接b为可存储的接口设备c为键盘鼠标等输入设备
2、3、4个字符表示所有者权限,5、6、7个字符表示所有者同组用户权限,8、9、10为其他用户权限
第二个字符表示所有者读权限,如果有权限则为r,没有权限则为-
第三个字符表示所有者写权限,如果有权限则为w,没有权限则为-
第四个字符表示所有者执行权限,如果有权限则为x,没有权限则为-
第五个字符表示所有者同组用户读权限,如果有权限则为r,没有权限则为-
第六个字符表示所有者同组用户写权限,如果有权限则为w,没有权限则为-
第七个字符表示所有者同组用户执行权限,如果有权限则为x,没有权限则为-
第八个字符表示其他非同组读权限,如果有权限则为r,没有权限则为-
第九个字符表示其他非同组写权限,如果有权限则为w,没有权限则为-
第十个字符表示其他非同组执行权限,如果有权限则为x,没有权限则为-
修改文件所属组命令:
[root@localopt]#chgrp[-R]组名文件名
其中-R为递归设置
修改文件的所有者和组命令:
[root@localopt]#chown[-R]用户[:用户组]文件名
修改文件访问权限命令:
[root@localopt]#chmod[-R]0777文件名
至此,用户、文件和权限相关的东西,就总结个7788了,接下来的就是,平常要敢于用各种命令,勤于看看本篇总结啦。
====================================================================
linux查看用户及用户组的方法
whois
功能说明:查找并显示用户信息。
语法:whois[帐号名称]
补充说明:whois指令会去查找并显示指定帐号的用户相关信息,因为它是到NetworkSolutions的WHOIS数据库去查找,所以该帐号名称必须在上面注册方能寻获,且名称没有大小写的差别。
---------------------------------------------------------
whoami
功能说明:先似乎用户名称。
语法:whoami[--help][--version]
补充说明:显示自身的用户名称,本指令相当于执行"id-un"指令。
参数:
--help在线帮助。
--version显示版本信息。
---------------------------------------------------
who
功能说明:显示目前登入系统的用户信息。
语法:who[-Himqsw][--help][--version][ami][记录文件]
补充说明:执行这项指令可得知目前有那些用户登入系统,单独执行who指令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个X显示器。
参数:
-H或--heading显示各栏位的标题信息列。
-i或-u或--idle显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串。
-m此参数的效果和指定"ami"字符串相同。
-q或--count只显示登入系统的帐号名称和总人数。
-s此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题。
-w或-T或--mesg或--message或--writable显示用户的信息状态栏。
--help在线帮助。
--version显示版本信息。
----------------------------------------------------
w
功能说明:显示目前登入系统的用户信息。
语法:w[-fhlsuV][用户名称]
补充说明:执行这项指令可得知目前登入系统的用户有那些人,以及他们正在执行的程序。单独执行w
指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。
参数:
-f开启或关闭显示用户从何处登入系统。
-h不显示各栏位的标题信息列。
-l使用详细格式列表,此为预设值。
-s使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
-u忽略执行程序的名称,以及该程序耗费CPU时间的信息。
-V显示版本信息。
-----------------------------------------------------
finger命令
finger命令的功能是查询用户的信息,通常会显示系统中某个用户的用户名、主目录、停滞时间、登录时间、登录shell等信息。如果要查询远程机上的用户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网络主机需要运行finger守护进程。
该命令的一般格式为:
finger[选项][使用者][用户@主机]
命令中各选项的含义如下:
-s显示用户的注册名、实际姓名、终端名称、写状态、停滞时间、登录时间等信息。
-l除了用-s选项显示的信息外,还显示用户主目录、登录shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。
-p除了不显示.plan文件和.project文件以外,与-l选项相同。
[例]在本地机上使用finger命令。
$fingerxxq
Login:xxqName:
Directory:/home/xxqShell:/bin/bash
LastloginThuJan121:43(CST)ontty1
Nomail.
NoPlan.
$finger
LoginNameTtyIdleLoginTimeOfficeOfficePhone
rootroot*128Nov2509:17
……
------------------------------------------------------------------
/etc/group文件包含所有组
/etc/shadow和/etc/passwd系统存在的所有用户名
修改当前用户所属组的方法
usermod或者可以直接修改/etc/paaawd文件即可
----------------------------------------------------------------
vlock(virtualconsolelock)
功能说明:锁住虚拟终端。
语法:vlock[-achv]
补充说明:执行vlock指令可锁住虚拟终端,避免他人使用。
参数:
-a或--all锁住所有的终端阶段作业,如果您在全屏幕的终端中使用本参数,则会将用键盘
切换终端机的功能一并关闭。
-c或--current锁住目前的终端阶段作业,此为预设值。
-h或--help在线帮助。
-v或--version显示版本信息。
--------------------------------------------------------
usermod
功能说明:修改用户帐号。
语法:usermod[-LU][-c<备注>][-d<登入目录>][-e<有效期限>][-f<缓冲天数>][-g<群组>][-G<群组>][-l<帐号名称>][-s][-u][用户帐号]
补充说明:usermod可用来修改用户帐号的各项设定。
参数:
-c<备注>修改用户帐号的备注文字。
-d登入目录>修改用户登入时的目录。
-e<有效期限>修改帐号的有效期限。
-f<缓冲天数>修改在密码过期后多少天即关闭该帐号。
-g<群组>修改用户所属的群组。
-G<群组>修改用户所属的附加群组。
-l<帐号名称>修改用户帐号名称。
-L锁定用户密码,使密码无效。
-s修改用户登入后所使用的shell。
-u修改用户ID。
-U解除密码锁定。
-------------------------------------------------------
userdel
功能说明:删除用户帐号。
语法:userdel[-r][用户帐号]
补充说明:userdel可删除用户帐号与相关的文件。若不加参数,则仅删除用户帐号,而不删除相关文件。
参数:
-f删除用户登入目录以及目录中所有文件。
----------------------------------------------------------
userconf
功能说明:用户帐号设置程序。
语法:userconf[--addgroup<群组>][--adduser<用户ID><群组><用户名称>][--delgroup<群组>][--deluser<用户ID>][--help]
补充说明:userconf实际上为linuxconf的符号连接,提供图形界面的操作方式,供管理员建立与管理各类帐号。若不加任何参数,即进入图形界面。
参数:
--addgroup<群组>新增群组。
--adduser<用户ID><群组><用户名称>新增用户帐号。
--delgroup<群组>删除群组。
--deluser<用户ID>删除用户帐号。
--help显示帮助。
------------------------------------------------------
useradd
功能说明:建立用户帐号。
语法:useradd[-mMnr][-c<备注>][-d<登入目录>][-e<有效期限>][-f<缓冲天数>][-g<群组>][-G<群组>][-s][-u][用户帐号]或useradd-D[-b][-e<有效期限>][-f<缓冲天数>][-g<群组>][-G<群组>][-s]
补充说明:useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
参数:
-c<备注>加上备注文字。备注文字会保存在passwd的备注栏位中。
-d<登入目录>指定用户登入时的启始目录。
-D变更预设值.
-e<有效期限>指定帐号的有效期限。
-f<缓冲天数>指定在密码过期后多少天即关闭该帐号。
-g<群组>指定用户所属的群组。
-G<群组>指定用户所属的附加群组。
-m自动建立用户的登入目录。
-M不要自动建立用户的登入目录。
-n取消建立以用户名称为名的群组.
-r建立系统帐号。
-s指定用户登入后所使用的shell。
-u指定用户ID。