linux ftp 服务器配置

# 安装前准备准备
1. 关闭防火墙
service iptables stop 或者 systemctl stop  iptables.service (centos7.0)
service firewalld stop 或者  systemctl stop  firewalld.service
2.  sestatus -v  查看状态是不是disabled,如果不是,
–  修改/etc/selinux/config 文件将SELINUX=enforcing改为SELINUX=disabled (修改后,重启生效)
–    setenforce 0   临时关闭

# 安装
1.yum install  vsftpd -y
#  配置
1.  /ets/vsftpd 文件内容
vsftpd.conf: 主配置文件
ftpusers: 指定哪些用户不能访问FTP服务器
user_list: 指定的用户是否可以访问ftp服务器由vsftpd.conf文件中的 userlist_deny的取值来决定。
2. 查看配置文件配置 cat /etc/vsftpd/vsftpd.conf |grep -v ‘^#’;
3. 配置文件vsftpd.conf 里面以下
anon_upload_enable=YES
anon_mkdir_write_enable=YES
开启匿名匿名用户的配置
4. 我们可以在vsftpd.conf 文件设置如下参数:

限制IP 访问FTP:
#vi /etc/hosts.allow

vsftpd:192.168.5.128:DENY 设置该IP地址不可以访问ftp服务

FTP 访问时间限制:

#cp /usr/share/doc/vsftpd-1.1.3/vsftpd.xinetd /etc/xinetd.d/vsftpd

#vi /etc/xinetd.d/vsftpd/

修改 disable = no

access_time = hour:min-hour:min (添加配置访问的时间限制(注:与vsftpd.conf中listen=NO相对应)

例: access_time = 8:30-11:30 17:30-21:30 表示只有这两个时间段可以访问ftp
5. 要注意的是userlist_enable=YES(是否读取userlist), userlist_deny=NO(userlist允许ftp连接,默认YES),只有在userlist用户才允许ftp链接,其他用户不允许链接,
系统会读取userlist文件列表,但还会读取ftpusers(那些用户不允许ftp登陆)

# 新建用户
1. useradd -d /home/test test
2. passwd test 设置密码
3. usermod -s /sbin/nologin test 不让登陆shell

CentOS的ssh sftp配置及权限设置

1、从安全方面看,sftp会更安全一点
2、线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动
3、用户只能使用sftp,不能ssh到机器进行操作
提供sftp服务,可以用系统自带的internal-sftp,也可以使用vsftpd,这里需求不多,直接选用internal-sftp。
限制用户只能在自己的home目录下活动,这里需要使用到chroot,openssh 4.8p1以后都支持chroot,我现在用的是CentOS 6.3,自带的openssh已经是5.3p1,足够了。
可以输入:
# ssh -V  
来查看openssh的版本,如果低于4.8p1,需要自行升级安装,不在这里具体介绍了。
假设,有一个名为sftp的组,这个组中的用户只能使用sftp,不能使用ssh,且sftp登录后只能在自己的home目录下活动
1、创建sftp组
# groupadd sftp  
2、创建一个sftp用户,名为mysftp
# useradd -g sftp -s /bin/false mysftp
# passwd mysftp
3、sftp组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftp的home为/data/sftp/mysftp
# mkdir -p /data/sftp/mysftp
# usermod -d /data/sftp/mysftp mysftp
4、配置sshd_config
编辑 /etc/ssh/sshd_config
# vim +132 /etc/ssh/sshd_config  
找到如下这行,并注释掉
Subsystem      sftp    /usr/libexec/openssh/sftp-server  
添加如下几行
Subsystem       sftp    internal-sftp  
Match Group sftp  
ChrootDirectory /data/sftp/%u  
ForceCommand    internal-sftp  
AllowTcpForwarding no  
X11Forwarding no  
解释一下添加的几行的意思
Subsystem       sftp    internal-sftp  
这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp  
这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割
当然,也可以匹配用户
Match User mysftp
这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便
ChrootDirectory /data/sftp/%u  
用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动,chroot的含义,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
ForceCommand    internal-sftp  
指定sftp命令
AllowTcpForwarding no  
X11Forwarding no  
这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉
5、设定Chroot目录权限
# chown root:sftp /data/sftp/mysftp
# chmod 755 /data/sftp/mysftp
错误的目录权限设定会导致在log中出现”fatal: bad ownership or modes for chroot directory XXXXXX”的内容
目录的权限设定有两个要点:
1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root
2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限
所以遵循以上两个原则
1)我们将/data/sftp/mysftp的所有者设置为了root,所有组设置为sftp
2)我们将/data/sftp/mysftp的权限设置为755,所有者root有写入权限,而所有组sftp无写入权限
6、建立SFTP用户登入后可写入的目录
照上面设置后,在重启sshd服务后,用户mysftp已经可以登录,但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限
# mkdir /data/sftp/mysftp/upload  
# chown mysftp:sftp /data/sftp/mysftp/upload  
# chmod 755 /data/sftp/mysftp/upload  
7、重启sshd服务
# service sshd restart  
到这里,mysftp已经可以通过sftp客户端登录并可以上传文件到upload目录。
如果还是不能在此目录下上传文件,提示没有权限,检查SElinux是否关闭,可以使用如下指令关闭SElinux
修改/etc/selinux/config文件中的SELINUX=”” 为 disabled ,然后重启。或者
# setenforce 0

一开始,我以为是权限问题导致的无法上传文件,即使给777权限给文件夹也不行. 然后干脆关闭了SElinux,终于可以上传了。

如果你链接服务器的时候出现下面的提示:
Write failed: Broken pipe
Couldn’t read packet: Connection reset by peer
这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。

centos 7.0 关闭防火墙

1. Disable Firewalld Service.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld

2. Stop Firewalld Service.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl stop firewalld

3. Install iptables service related packages.

[root@rhel-centos7-tejas-barot-linux ~]# yum -y install iptables-services

4. Make sure service starts at boot:

[root@rhel-centos7-tejas-barot-linux ~]# systemctl enable iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl enable ip6tables

5. Now, Finally Let’s start the iptables services.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl start iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl start ip6tables

Firewalld Service is now disabled and stop, You can use iptables.

linux 添加开机启动

但是大多数都是把命令写到/etc/rc.d/rc.local或者 /etc/rc.local里,这样虽然能够实现随机运行,但是并不够灵活。不能像mysql,apache等服务一样能够使用service命令或者调 用init.d下的脚本启动、关闭或者重启进程。例如,

service mysql restart
service apache2 stop

或者

/etc/init.d/mysql restart
/etc/init.d/apache2 stop

编写一个启动控制脚本,以proxy为例,建立/etc/init.d/proxy文本文件,输入下面的内容:

#!/bin/sh

case "$1" in
start)
        start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
        start-stop-daemon --stop --name proxy.py
esac

 

这是一个简单的shell脚本,case .. in是用来根据调用参数进行不同的操作,start-stop-daemon是一个可以管理daemon进程的程序,要查看它的详细说明,可以运行man start-stop-daemon。start的时候,使用–exec指定要执行的文件,stop的时候,使用–name根据进程名字来使用 killall结束匹配的进程。

接着,设置脚本文件属性,设置可执行标记。

root@localhost:~# chmod 755 /etc/init.d/proxy

这样子,就可以使用service命令来启动和关闭进程了,例如启动进程如下:

root@localhost:~# service proxy start
root@localhost:~# ps aux|grep proxy
root       353  1.4  1.9   8644  5212 ?        S    09:50   0:00 /usr/bin/python /root/proxy.py
root       355  0.0  0.2   1900   596 pts/0    S+   09:50   0:00 grep --color=auto proxy

关闭进程,

root@localhost:~# service proxy stop
root@localhost:~# ps aux |grep proxy
root       365  0.0  0.2   1900   592 pts/0    S+   09:51   0:00 grep --color=auto proxy

到这里,一个Linux服务的进程控制脚本已经写好了,但是要实现随机启动,还需要一个步骤。
Linux开机的时候,不是直接运行/etc/init.d下的所有脚本的,而是根据不同的runlevel来执行/etc/rc$runlevel.d 下的脚本。这里的runlevel是用以区别系统的运行方式(例如单用户的runlevel,多媒体桌面的runlevel,服务器的runlevel都 不同)。

在Ubuntu里,可以使用update-rc.d来把/etc/init.d/proxy安装到各个runlevel中。更多关于update-rc.d的说明,请参见man update-rc.d。

root@localhost:~# update-rc.d proxy defaults 99
update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/proxy ...
   /etc/rc0.d/K99proxy -> ../init.d/proxy
   /etc/rc1.d/K99proxy -> ../init.d/proxy
   /etc/rc6.d/K99proxy -> ../init.d/proxy
   /etc/rc2.d/S99proxy -> ../init.d/proxy
   /etc/rc3.d/S99proxy -> ../init.d/proxy
   /etc/rc4.d/S99proxy -> ../init.d/proxy
   /etc/rc5.d/S99proxy -> ../init.d/proxy

update-rc.d后面有三个参数,分别是/etc/init.d下的脚本名字,默认安装方式,运行的优先级。优先级的数字越大,表示越迟运行,这里我们把自己写的服务放在最后运行。

如果要卸载随机启动的服务,执行

update-rc.d -f proxy remove

在update-rc.d安装的时候提示了警告信息,是因为我们写的/etc/init.d/proxy太简陋了,连LSB的信息也没有提供。

update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>

只需要做一些小改动,就可以避免那个警告了。如下:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          proxy
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop the HTTP Proxy.
### END INIT INFO

case "$1" in
start)
        start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
        start-stop-daemon --stop --name proxy.py
esac

到此,一个最简单的随机启动服务写好了,看起来文章挺长的,但其实也就几个命令而已。
在下次开机启动的时候,proxy.py就会以root用户身份被自动运行。


现在,你应该知道怎么编写属于自己的service命令了吧,编写一个脚本,然后把它放在/etc/init.d这个目录底下,你就可以用service +脚本名字 运行它。如果是要开机自动启动那就得用chkconfig命令了。

注意:

A、service这个命令往往是即时生效,不用开关机,但是重启后服务会回到默认状态。

B、chkconfig是用于把服务加到开机自动启动列表里,只要启动它,就能自动启动,重启后永久生效

即:chkconfig –add COMMAND 

      chkconfig COMMAND on/off    重启后永久生效


 

—恢复内容结束—

  • 简单
  • 正规
  • chkconfig
  • 用start-stop-daemon启动Nginx


 

编辑  vim /etc/init.d/rc.local 文件

 


 

参考:创建一个最简单的Linux随机启动服务

但是大多数都是把命令写到/etc/rc.d/rc.local或者 /etc/rc.local里,这样虽然能够实现随机运行,但是并不够灵活。不能像mysql,apache等服务一样能够使用service命令或者调 用init.d下的脚本启动、关闭或者重启进程。例如,

service mysql restart
service apache2 stop

或者

/etc/init.d/mysql restart
/etc/init.d/apache2 stop

编写一个启动控制脚本,以proxy为例,建立/etc/init.d/proxy文本文件,输入下面的内容:

复制代码
#!/bin/sh

case "$1" in
start)
        start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
        start-stop-daemon --stop --name proxy.py
esac

 

这是一个简单的shell脚本,case .. in是用来根据调用参数进行不同的操作,start-stop-daemon是一个可以管理daemon进程的程序,要查看它的详细说明,可以运行man start-stop-daemon。start的时候,使用–exec指定要执行的文件,stop的时候,使用–name根据进程名字来使用 killall结束匹配的进程。

接着,设置脚本文件属性,设置可执行标记。

root@localhost:~# chmod 755 /etc/init.d/proxy

这样子,就可以使用service命令来启动和关闭进程了,例如启动进程如下:

root@localhost:~# service proxy start
root@localhost:~# ps aux|grep proxy
root       353  1.4  1.9   8644  5212 ?        S    09:50   0:00 /usr/bin/python /root/proxy.py
root       355  0.0  0.2   1900   596 pts/0    S+   09:50   0:00 grep --color=auto proxy

关闭进程,

root@localhost:~# service proxy stop
root@localhost:~# ps aux |grep proxy
root       365  0.0  0.2   1900   592 pts/0    S+   09:51   0:00 grep --color=auto proxy

到这里,一个Linux服务的进程控制脚本已经写好了,但是要实现随机启动,还需要一个步骤。
Linux开机的时候,不是直接运行/etc/init.d下的所有脚本的,而是根据不同的runlevel来执行/etc/rc$runlevel.d 下的脚本。这里的runlevel是用以区别系统的运行方式(例如单用户的runlevel,多媒体桌面的runlevel,服务器的runlevel都 不同)。

在Ubuntu里,可以使用update-rc.d来把/etc/init.d/proxy安装到各个runlevel中。更多关于update-rc.d的说明,请参见man update-rc.d。

root@localhost:~# update-rc.d proxy defaults 99
update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/proxy ...
   /etc/rc0.d/K99proxy -> ../init.d/proxy
   /etc/rc1.d/K99proxy -> ../init.d/proxy
   /etc/rc6.d/K99proxy -> ../init.d/proxy
   /etc/rc2.d/S99proxy -> ../init.d/proxy
   /etc/rc3.d/S99proxy -> ../init.d/proxy
   /etc/rc4.d/S99proxy -> ../init.d/proxy
   /etc/rc5.d/S99proxy -> ../init.d/proxy

update-rc.d后面有三个参数,分别是/etc/init.d下的脚本名字,默认安装方式,运行的优先级。优先级的数字越大,表示越迟运行,这里我们把自己写的服务放在最后运行。

如果要卸载随机启动的服务,执行

update-rc.d -f proxy remove

在update-rc.d安装的时候提示了警告信息,是因为我们写的/etc/init.d/proxy太简陋了,连LSB的信息也没有提供。

update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>

只需要做一些小改动,就可以避免那个警告了。如下:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          proxy
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop the HTTP Proxy.
### END INIT INFO

case "$1" in
start)
        start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
        start-stop-daemon --stop --name proxy.py
esac

到此,一个最简单的随机启动服务写好了,看起来文章挺长的,但其实也就几个命令而已。
在下次开机启动的时候,proxy.py就会以root用户身份被自动运行。


 

现在,你应该知道怎么编写属于自己的service命令了吧,编写一个脚本,然后把它放在/etc/init.d这个目录底下,你就可以用service +脚本名字 运行它。如果是要开机自动启动那就得用chkconfig命令了。

注意:

A、service这个命令往往是即时生效,不用开关机,但是重启后服务会回到默认状态。

B、chkconfig是用于把服务加到开机自动启动列表里,只要启动它,就能自动启动,重启后永久生效

即:chkconfig –add COMMAND 

      chkconfig COMMAND on/off    重启后永久生效


 webiopi:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          webiopi
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: WebIOPi initscript
# Description:       WebIOPi initscript
### END INIT INFO

# Author: trouch <trouch@trouch.com>
WEBIOPI_HOME=/var/www/webiopi
WEBIOPI_PORT=80


PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="WebIOPi"
NAME=webiopi
DAEMON=/usr/bin/python
DAEMON_ARGS="$WEBIOPI_HOME/webiopi.py $WEBIOPI_PORT"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --quiet --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
    status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac

:

 


 

范本:

#!/bin/sh
NAME=webiopi
DAEMON=/usr/bin/python
DAEMON_ARGS="$WEBIOPI_HOME/webiopi.py $WEBIOPI_PORT" 
PIDFILE=/var/run/$NAME.pid  

case "$1" in
start)
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile -- $DAEMON_ARGS
;;
stop)
        start-stop-daemon --stop --quiet --pidfile $PIDFILE --name $NAME
esac

sudo update-rc.d webiopi defaults

Linux查看系统配置常用命令

 

# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量 资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载 磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况 网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息 进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态 用户
# w # 查看活动用户
# id # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户

# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务 服务
# chkconfig –list # 列出所有系统服务
# chkconfig –list | grep on # 列出所有启动的系统服务 程序
# rpm -qa # 查看所有安装的软件包

shell 脚本学习笔记

一、变量
1.不通变量   test = ‘xiaofang’
2.特殊变量
$0  :  当前脚本的文件名
$n  :   传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2
$#  :   传递给脚本或函数的参数个数
$*   :   传递给脚本或函数的所有参数。
$@  :   传递给脚本或函数的所有参数。被双引号(” “)包含时,与 $* 稍有不同
$?  :   上个命令的退出状态,或函数的返回值
$$  :   当前Shell进程ID
tips:  $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。

但是当它们被双引号(” “)包含时,”$*” 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;”$@” 会将各个参数分开,以”$1″ “$2” … “$n” 的形式输出所有参数。
二、shell 替换
1.echo  -e  ‘xiaofang  \n’  ;   让转移符生效-E 选项禁止转义;-n 选项可以禁止插入换行符。
2. date = `date`     echo $date                 ;把命令结果用变量保存起来

3.${var} :  变量原来的值
${var:-word}    如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
${var:=word}    如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
${var:?message}   如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var                                    是否可以被正常赋值。
若此替换出现在Shell脚本中,那么脚本将停止运行。
${var:+word}       如果变量 var 被定义,那么返回 word,但不改变 var 的值。
4.unset 删除变量
三、shell 运算符
1.expr 是一款表达式计算工具,使用它能完成表达式的求值操作
2.  var =`expr 2 + 2`
两点注意:
||.表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
||.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
||.乘号(*)前边必须加反斜杠(\)才能实现乘法运算
||. 字符串比较用  =
四、字符串
1.echo ${#string}   字符串长度
2.echo ${string:1:4}   提取字符串
3.echo `expr index “$string” is`          查找字符创
五、数组
1.array_name=(value0 value1 value2 value3)    定义数组
array_name[0]=value0
2.
valuen=${array_name[2]}       读取数组
3.
${array_name[*]}和${array_name[@]}  代表所有元素
六、循环
1.if … fi 语句;    [ $a  ==  $b  ]  []  之间必须有空格,否则会有语法错误。
2.if test $[num1] -eq $[num2]
 then
echo ‘The two numbers are equal!’
 else
          echo ‘The two numbers are not equal!’
 fi
test 命令用于检查某个条件是否成立,与方括号([ ])类似。
3.
tips:  read input      ;读取用户输入的,保存在$input 变量中
七、函数
1.删除变量  unset  var_name
   删除函数   unset .f function_name   要加  .f

 

linux添加环境变量的方法总结

linux添加环境变量的方法总结
linux对环境变量有无双引号、或者变量用不用{}括起来并不敏感,小小的看了下profile文件,似乎系统如果发现变量没有引号,会自动加上。
但变量前必须加$符号,类似于perl
  www.2cto.com
三种添加环境变量的方法,在fedora使用jena时都试过了:
1、直接使用export命令:
比如:
export PATH=$PATH:/home/lm/apache-jena-2.7.4/bin
export CLASSPATH=.:/home/liaomeng/apache-jena-2.7.4/lib
命令export可以查看各个系统变量和路径,发现系统变量中PATH中多了设置的路径,增加了CLASSPATH变量,则设置成功
也可单个变量输出查看:
echo $CLASSPATH
echo $PATH
2. 修改/etc/profile文件
在/etc/profile文件末尾添加:
export JENAROOT=/home/liaomeng/apache-jena-2.7.4
export PATH=$JENAROOT/bin:$PATH             ##在已有的PATH变量前面添加jena路径,其中的冒号为分隔符
export CLASSPATH=.:$JENAROOT/lib/jena-core-2.7.4.jar        ##使用*.jar好像不好使,试了很多次,如果有多个jar包需要添加,也用冒号分隔
  www.2cto.com
source /etc/profile使修改生效,不必重启系统
有人说也可以在/etc/profile.d/文件夹中添加个sh文件,/etc/profile文件似乎会自动读取/etc/profile.d/文件夹中的各个脚本文件,我还没试过。
另外需要注意:
CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的致命错误。
在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种常见的错误。
软件越装越多,环境变量越添越多,为了避免造成混乱,所以建议所有语句都添加在文件结尾,按软件的安装顺序添加。
3. 修改主目录下的隐藏文件./bashrc
修改方式与修改/etc/profile文件相同
source .bashrc使修改生效

 linux中查找命令find、locate、whereis、which、type区别

1.find
find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。与查询数据库(/var/lib/locatedb)文件不同,find查找磁盘空间

find的使用格式如下:

$ find <指定目录> <指定条件> <指定动作>

– <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。

– <指定条件>: 所要搜索的文件的特征。

– <指定动作>: 对搜索结果进行特定的处理。

如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

find的使用实例:

$ find . -name ‘my*’

搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。

$ find . -name ‘my*’ -ls

搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。

$ find . -type f -mmin -10

搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

2. locate

Java代码

locate命令其实是”find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

locate命令的使用实例:

$ locate /etc/sh

搜索etc目录下所有以sh开头的文件。

$ locate ~/m

搜索用户主目录下,所有以m开头的文件。

$ locate -i ~/m

搜索用户主目录下,所有以m开头的文件,并且忽略大小写。

3. whereis

Java代码

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。同locate一样,查询数据库(/var/lib/locatedb)文件

whereis命令的使用实例:

$ whereis grep

4. which

Java代码

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

which命令的使用实例:

$ which grep

5. type

Java代码

type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。

type命令的使用实例:

$ type cd

系统会提示,cd是shell的自带命令(build-in)。

$ type grep

系统会提示,grep是一个外部命令,并显示该命令的路径。

$ type -p grep

加上-p参数后,就相当于which命令

linux 开启关闭防火墙

1) 重启后永久性生效:

开启:chkconfig iptables on

关闭:chkconfig iptables off

(2) 即时生效,重启后失效:

开启:service iptables start

关闭:service iptables stop

需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。

在开启了防火墙时,做如下设置,开启相关端口,

修改/etc/sysconfig/iptables 文件,添加以下内容:

-A RH-Firewall-1-INPUT -m state ——state NEW -m tcp -p tcp ——dport 80 -j ACCEPT

-A RH-Firewall-1-INPUT -m state ——state NEW -m tcp -p tcp ——dport 22 -j ACCEPT

或者:

/etc/init.d/iptables status 会得到一系列信息,说明防火墙开着。

/etc/rc.d/init.d/iptables stop 关闭防火墙

最后:

在根用户下输入setup,进入一个图形界面,选择Firewall configuration,进入下一界面,选择Security Level为Disabled,保存。重启即可。

======================================================

fedora下

/etc/init.d/iptables stop

=======================================================

ubuntu下:

由于UBUNTU没有相关的直接命令

请用如下命令

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

暂时开放所有端口

Ubuntu上没有关闭iptables的命令

=======================================================

iptables 是linux下一款强大的防火墙,在不考虑效率的情况下,功能强大到足可以替代大多数硬件防火墙,但是强大的防火墙如果应用不当,可能挡住的可不光是那些潜在的攻击,还有可能是你自己哦。这个带来的危害对于普通的个人PC来说可能无关紧要,但是想象一下,如果这是一台服务器,一旦发生这样的情况,不光是影院正常的服务,还需要到现场去恢复,这会给你带来多少损失呢?

所以我想说的是,当你敲入每一个iptables 相关命令的时候都要万分小心。

1.应用每一个规则到DROP target时,都要仔细检查规则,应用之前要考虑他给你带来的影响。

2.在redhat中我们可以使用service iptables stop来关闭防火墙,但是在有些版本如ubuntu中这个命令却不起作用,大家可能在网上搜索到不少文章告诉你用iptables -F这个命令来关闭防火墙,但是使用这个命令前,千万记得用iptables -L查看一下你的系统中所有链的默认target,iptables -F这个命令只是清除所有规则,只不会真正关闭iptables.想象一下,如果你的链默认target是DROP,本来你有规则来允许一些特定的端口,但一旦应用iptables -L ,清除了所有规则以后,默认的target就会阻止任何访问,当然包括远程ssh管理服务器的你。

所以我建议的关闭防火墙命令是

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -F

总之,当你要在你的服务器上做任何变更时,最好有一个测试环境做过充分的测试再应用到你的服务器。除此之外,要用好iptables,那就要理解iptables的运行原理,知道对于每一个数据包iptables是怎么样来处理的。这样才能准确地书写规则,避免带来不必要的麻烦。