JNI線程、Linux經常使用命令、權限、防火牆配置

JNI_OnLoad:java

調用System.loadLibrary()函數時, 內部就會去查找so中的 JNI_OnLoad 函數,若是存在此函數則調用。mysql

JNI_OnLoad會:linux

告訴 VM 此 native 組件使用的 JNI 版本。android

​ 對應了Java版本,android中只支持JNI_VERSION_1_2 、JNI_VERSION_1_四、JNI_VERSION_1_6,其中JNI_VERSION_1_1這個不能用,用它會報錯的。
ios

​ 在JDK1.8有 JNI_VERSION_1_8。web

下面我們來寫一個該函數:sql

編譯運行:編程

那要這說這個函數有啥用呢?大有用處,我們先來看一下該函數的第一個參數:vim

動態註冊就其中的一個用處,因此接下來看一下學習一下動態註冊。windows

動態註冊:

在此以前咱們一直在jni中使用的 Java_PACKAGENAME_CLASSNAME_METHODNAME 來進行與java方法的匹配,這種方式咱們稱之爲靜態註冊。如這個:

其native方法就是按照 Java_PACKAGENAME_CLASSNAME_METHODNAME 規則來進行定義的,以下:

而動態註冊則意味着方法名能夠不用這麼長了,也就是咱們能夠拋開 Java_PACKAGENAME_CLASSNAME_METHODNAME 這個規則動態DIV,在android aosp源碼中就大量的使用了動態註冊的形式。下面就來實現我們的動態註冊,先在Java層聲明一個native方法:

而後我們在CPP中定義一個函數,不按照 Java_PACKAGENAME_CLASSNAME_METHODNAME ,以下:

接下來則就須要動態註冊將這兩個進行對應上,首先我們將JNI_OnLoad這個函數的第一個參數用全局變量保存一下,由於在將來其它函數實現中都有可能用到它,因此:

而後關鍵的對應代碼來了:須要在cpp中定義一個JNINativeMethod數組,裏面則會存放各映射關係,以下:

其實它是一個結構體,我們來看一下它的定義:

因此根據結構體的定義,我們就來動態註冊一下:

動態註冊好以後,我們在cpp的函數中打印一句話用來看輸出效果:

接下來來要聲明哪個Java類須要動態註冊,須要寫全類名,以下:

而後此時就須要利用JNI_OnLoad函數中的JavaVM對其進行動態註冊,具體如何搞呢?對於JNI方法實現中最重要的參數則是JNIEnv啦:

,因此首先我們也得利用它,可是在JNI_OnLoad函數中只有JavaVM參數,木有JNIEnv,怎麼弄呢?固然是能夠經過JavaVM這個參數得到JNIEnv嘍,具體寫法以下:

其中r的返回值小於0則是失敗,等於0則是成功,接下來則用反射來獲取我們以前聲明的className變量的class對象,以下:

接着就開始註冊啦,具體作法以下:

下面來運行一下看可否對應上動態註冊的函數:

嗯~~確實達到了動態映射,不過我們再來定義另一個帶參數的native方法會發現一個問題,以下:

而後在cpp中定義對應的實現:

而後再運行看效果:

當有參數的時候這裏就得特別的注意啦,在日常我們靜態註冊時每一個函數都會有這兩個參數,以下:

因此是否是在動態註冊有帶參數的狀況下也得要加上這兩個參數呢?我們試試:

一切正常了,因此。。在動態註冊時得特別注意帶參數的狀況~~

native線程調用Java:

native調用java須要使用JNIEnv這個結構體,而JNIEnv是由Jvm傳入與線程相關的變量。

可是能夠經過JavaVM的AttachCurrentThread方法來獲取到當前線程中的JNIEnv指針。

我們先來聲明一個ndk方法:

而要用到線程實際上是有兩種方式:一是用到posix線程方式,還有一種是用C++ 11的方式,這裏用標準的posix線程方式,先引入頭文件:

而後建立一個線程:

假如說咱們在native層開個線程去下載東東,而後下載完成以後會通知應用Java層,那麼確定就存在Native線程會要去調用Java方法的場景,因此下面就來模擬一下:

我們在MainActivity中定義一個通知結果的方法,以下:

而後我們在線程中來反射這個方法,而根據經驗我們須要在線程執行函數中來獲取以下兩個參數:

而執行函數只能接收一個參數,因此我們聲明一個結構體來對這兩個參數進行包裝一下,以下:

而後我們將參數傳到threadTask參數中,以下:

然我們來在執行方法中來反射調用Java中的updateUI方法,因爲以前都學過了,直接上代碼:

編譯運行:

拋異常崩掉了,這是爲啥呢,此時的日誌報得有些模糊,能夠將Logcat的TAG過濾去掉,就能夠看到堆棧信息了,以下:

11-09 09:29:01.581 2018-2032/? E/dalvikvm: JNI ERROR: non-VM thread making JNI call (GetObjectClass)
    VM aborting
11-09 09:29:01.581 2018-2032/com.jni.test A/libc: Fatal signal 6 (SIGABRT) at 0x000007e2 (code=-6), thread 2032 (com.jni.test)
11-09 09:29:01.605 680-686/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.625 877-883/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.669 1390-1396/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.685 222-222/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    Build fingerprint: 'generic/vbox86p/vbox86p:4.4.4/KTU84P/14:userdebug/test-keys'
    Revision: '0'
    pid: 2018, tid: 2032, name: com.jni.test  >>> com.jni.test <<<
11-09 09:29:01.689 222-222/? I/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
11-09 09:29:01.701 817-823/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.713 756-762/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.729 572-578/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.741 1469-1475/? I/jdwp: Ignoring second debugger -- accepting and dropping
11-09 09:29:01.905 226-559/? W/genymotion_audio: out_write() limiting sleep time 1845522210 to 39909
11-09 09:29:01.957 222-222/? I/DEBUG:     eax 00000000  ebx 000007e2  ecx 000007f0  edx 00000006
        esi 000007f0  edi 00000000
        xcs 00000073  xds 0000007b  xes 0000007b  xfs 00000000  xss 0000007b
        eip b76b2df6  ebp b7717ce0  esp 952c99a0  flags 00200207
    backtrace:
        #00  pc 0003bdf6  /system/lib/libc.so (tgkill+22)
        #01  pc 00000005  <unknown>
    stack:
11-09 09:29:01.961 222-222/? I/DEBUG:          952c9960  00000000  
             952c9964  b7713268  /system/lib/libc.so
             952c9968  00000000  
             952c996c  b7684f79  /system/lib/libc.so (pthread_mutex_unlock+25)
             952c9970  b771318c  /system/lib/libc.so
             952c9974  b7921568  [heap]
             952c9978  00000015  
             952c997c  00000000  
             952c9980  00000000  
             952c9984  b76d1846  /system/lib/libc.so (funlockfile+6)
             952c9988  b7712fcc  /system/lib/libc.so
             952c998c  b76bce96  /system/lib/libc.so (__sflush_locked+150)
             952c9990  00000000  
             952c9994  00000000  
             952c9998  b7684da9  /system/lib/libc.so (pthread_mutex_lock+9)
             952c999c  b7712fcc  /system/lib/libc.so
        #00  952c99a0  00000006  
             952c99a4  000007f0  
             952c99a8  b7712fcc  /system/lib/libc.so
             952c99ac  b768f556  /system/lib/libc.so (pthread_kill+102)
             952c99b0  000007e2  
             952c99b4  000007f0  
             952c99b8  00000006  
             952c99bc  00000000  
             952c99c0  b7713268  /system/lib/libc.so
             952c99c4  00000000  
             952c99c8  b768f4f9  /system/lib/libc.so (pthread_kill+9)
             952c99cc  b7712fcc  /system/lib/libc.so
             952c99d0  952c9a1c  [stack:2032]
             952c99d4  952c9c5c  [stack:2032]
             952c99d8  37900019  
             952c99dc  b768f91c  /system/lib/libc.so (raise+44)

不過報得也不是太明顯,可是從標紅的地方來看確定是線程那塊出問題了,那具體是哪句代碼形成呢,能夠用debug進行進一步定位跟蹤,以下:

往下走:

也就是說問題代碼出在:

這是爲什麼呢?從理解上來看貌似代碼沒啥問題的呀,其原則在於JNIEnv是不能跨線程使用的,也就是說:

此時怎麼解決呢?還記得以前咱們的JavaVM已經存爲全局變量了麼,以下:

它就有用武之地啦,具體如何弄呢?

而後此時再編譯運行:

發現仍是報錯。。通過查看更加詳細的日誌能夠發現緣由以下:

這是由於這個參數須要用全局共享的辦法來在子線程中用,因此修改程序以下:

編譯運行:

Linux 文件權限、VIM、防火牆:

關於NDK這塊還涉及到Linux的一些基礎使用,這個東東其實就是熟能生巧,其實在以前已經對其基本的用法進行了專門的學習,可是爲了在未來NDK學習打下更紮實的基礎因此這裏也總體作一個瞭解回顧。 

SSH鏈接:

不管是mac仍是windows的均可以選擇下載本身喜歡的遠程登錄客戶端工具,經過ssh協議鏈接到遠程主機。

客戶端的使用很是方便。但也有喜歡使用命令行的方式來進行鏈接,因此下面來看一下命令如何連:

使用root登錄1.1.1.1:(默認端口爲22)

ssh root@1.1.1.1

也可使用-p指定 ssh主機配置的端口

ssh -p 222 root@1.1.1.1

環境變量:

和Windows不一樣,Linux環境變量配置須要使用 export 聲明。如:

export PATH=${PATH}:java/bin:android/platform-tools

若是直接在終端中輸入命令,則設置PATH環境變量的值,但其做用範圍僅限於當前會話。即臨時環境變量。

若是說要設置永久的環境變量,涉及但不限於「profile【推薦用它】、bashrc、bash_profile 」這三個文件,其用其它一種就成,

profile:位於這個目靈:/etc/profile,以下:

而後在這個文件裏面用export進行環境變量配置,這是對全部用戶都生效,也就是若是電腦中有多個用戶,全局生效。

bash_profile:它位於~/.bash_profile,以下:

可是跟/etc/prifile不一樣的時,這個設置只針對當前用戶有效,若是切換其它用戶則設置的環境變量是不生效的。

bashrc:它位於~/.bashrc,以下:

它也是跟某個用戶相關的配置。

對於這三個環境變量相關的配置文件而言:首先讀入/etc/profile,讀取當前用戶目錄內的~/.bash_profile;最後,根據用戶賬號讀取~/.bashrc

/etc/ 是系統全局環境變量設定;~/是用戶私有環境變量設定。

在修改配置文件後,可以使用source /etc/profile刷新。

權限:

Linux系統從誕生就被設計爲多用戶系統,不一樣的用戶處於不一樣的地位,擁有不一樣的權限。爲了保護系統安全,Linux系統對不一樣的用戶訪問同一文件的權限作了不一樣而規定。

在Linux中能夠經過 `ls -l`  顯示文件的屬性以及文件所屬的用戶和組,以下:

其中:

其中具體的信息以下圖:

在Linux中第一個字符表明這個文件是目錄、文件或者連接等等,以下:

,其涉及到類型的有以下:

而後是三個爲一組的rwx, 其中r表示可讀,w 表示可寫, x表示可執行。對於每一個文件來講,它都有一個特定的全部者,也就是對該文件具備全部權的用戶。同時在Linux中用戶都是按組來進行分類的,一個用戶屬於一個或多個組。文件全部者以外的用戶又分爲文件全部者的同組用戶和其餘用戶。可使用如下命令查看當前使用的用戶信息:

以下:

  • 更改文件所屬:
    這裏先介紹命令用法:

    我們來試驗一下,先新建一個目錄:

    接下來我們來修改該文件的所屬用戶,先查看一下當前系統存在的用戶,可使用以下命令:

    xiongweideMacBook-Pro:linux xiongwei$ cat /etc/passwd
    ##
    # User Database
    # 
    # Note that this file is consulted directly only when the system is running
    # in single-user mode.  At other times this information is provided by
    # Open Directory.
    #
    # See the opendirectoryd(8) man page for additional information about
    # Open Directory.
    ##
    nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
    root:*:0:0:System Administrator:/var/root:/bin/sh
    daemon:*:1:1:System Services:/var/root:/usr/bin/false
    _uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
    _taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
    _networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
    _installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false
    _lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false
    _postfix:*:27:27:Postfix Mail Server:/var/spool/postfix:/usr/bin/false
    _scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false
    _ces:*:32:32:Certificate Enrollment Service:/var/empty:/usr/bin/false
    _appstore:*:33:33:Mac App Store Service:/var/empty:/usr/bin/false
    _mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false
    _appleevents:*:55:55:AppleEvents Daemon:/var/empty:/usr/bin/false
    _geod:*:56:56:Geo Services Daemon:/var/db/geod:/usr/bin/false
    _serialnumberd:*:58:58:Serial Number Daemon:/var/empty:/usr/bin/false
    _devdocs:*:59:59:Developer Documentation:/var/empty:/usr/bin/false
    _sandbox:*:60:60:Seatbelt:/var/empty:/usr/bin/false
    _mdnsresponder:*:65:65:mDNSResponder:/var/empty:/usr/bin/false
    _ard:*:67:67:Apple Remote Desktop:/var/empty:/usr/bin/false
    _www:*:70:70:World Wide Web Server:/Library/WebServer:/usr/bin/false
    _eppc:*:71:71:Apple Events User:/var/empty:/usr/bin/false
    _cvs:*:72:72:CVS Server:/var/empty:/usr/bin/false
    _svn:*:73:73:SVN Server:/var/empty:/usr/bin/false
    _mysql:*:74:74:MySQL Server:/var/empty:/usr/bin/false
    _sshd:*:75:75:sshd Privilege separation:/var/empty:/usr/bin/false
    _qtss:*:76:76:QuickTime Streaming Server:/var/empty:/usr/bin/false
    _cyrus:*:77:6:Cyrus Administrator:/var/imap:/usr/bin/false
    _mailman:*:78:78:Mailman List Server:/var/empty:/usr/bin/false
    _appserver:*:79:79:Application Server:/var/empty:/usr/bin/false
    _clamav:*:82:82:ClamAV Daemon:/var/virusmails:/usr/bin/false
    _amavisd:*:83:83:AMaViS Daemon:/var/virusmails:/usr/bin/false
    _jabber:*:84:84:Jabber XMPP Server:/var/empty:/usr/bin/false
    _appowner:*:87:87:Application Owner:/var/empty:/usr/bin/false
    _windowserver:*:88:88:WindowServer:/var/empty:/usr/bin/false
    _spotlight:*:89:89:Spotlight:/var/empty:/usr/bin/false
    _tokend:*:91:91:Token Daemon:/var/empty:/usr/bin/false
    _securityagent:*:92:92:SecurityAgent:/var/db/securityagent:/usr/bin/false
    _calendar:*:93:93:Calendar:/var/empty:/usr/bin/false
    _teamsserver:*:94:94:TeamsServer:/var/teamsserver:/usr/bin/false
    _update_sharing:*:95:-2:Update Sharing:/var/empty:/usr/bin/false
    _installer:*:96:-2:Installer:/var/empty:/usr/bin/false
    _atsserver:*:97:97:ATS Server:/var/empty:/usr/bin/false
    _ftp:*:98:-2:FTP Daemon:/var/empty:/usr/bin/false
    _unknown:*:99:99:Unknown User:/var/empty:/usr/bin/false
    _softwareupdate:*:200:200:Software Update Service:/var/db/softwareupdate:/usr/bin/false
    _coreaudiod:*:202:202:Core Audio Daemon:/var/empty:/usr/bin/false
    _screensaver:*:203:203:Screensaver:/var/empty:/usr/bin/false
    _locationd:*:205:205:Location Daemon:/var/db/locationd:/usr/bin/false
    _trustevaluationagent:*:208:208:Trust Evaluation Agent:/var/empty:/usr/bin/false
    _timezone:*:210:210:AutoTimeZoneDaemon:/var/empty:/usr/bin/false
    _lda:*:211:211:Local Delivery Agent:/var/empty:/usr/bin/false
    _cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
    _usbmuxd:*:213:213:iPhone OS Device Helper:/var/db/lockdown:/usr/bin/false
    _dovecot:*:214:6:Dovecot Administrator:/var/empty:/usr/bin/false
    _dpaudio:*:215:215:DP Audio:/var/empty:/usr/bin/false
    _postgres:*:216:216:PostgreSQL Server:/var/empty:/usr/bin/false
    _krbtgt:*:217:-2:Kerberos Ticket Granting Ticket:/var/empty:/usr/bin/false
    _kadmin_admin:*:218:-2:Kerberos Admin Service:/var/empty:/usr/bin/false
    _kadmin_changepw:*:219:-2:Kerberos Change Password Service:/var/empty:/usr/bin/false
    _devicemgr:*:220:220:Device Management Server:/var/empty:/usr/bin/false
    _webauthserver:*:221:221:Web Auth Server:/var/empty:/usr/bin/false
    _netbios:*:222:222:NetBIOS:/var/empty:/usr/bin/false
    _warmd:*:224:224:Warm Daemon:/var/empty:/usr/bin/false
    _dovenull:*:227:227:Dovecot Authentication:/var/empty:/usr/bin/false
    _netstatistics:*:228:228:Network Statistics Daemon:/var/empty:/usr/bin/false
    _avbdeviced:*:229:-2:Ethernet AVB Device Daemon:/var/empty:/usr/bin/false
    _krb_krbtgt:*:230:-2:Open Directory Kerberos Ticket Granting Ticket:/var/empty:/usr/bin/false
    _krb_kadmin:*:231:-2:Open Directory Kerberos Admin Service:/var/empty:/usr/bin/false
    _krb_changepw:*:232:-2:Open Directory Kerberos Change Password Service:/var/empty:/usr/bin/false
    _krb_kerberos:*:233:-2:Open Directory Kerberos:/var/empty:/usr/bin/false
    _krb_anonymous:*:234:-2:Open Directory Kerberos Anonymous:/var/empty:/usr/bin/false
    _assetcache:*:235:235:Asset Cache Service:/var/empty:/usr/bin/false
    _coremediaiod:*:236:236:Core Media IO Daemon:/var/empty:/usr/bin/false
    _launchservicesd:*:239:239:_launchservicesd:/var/empty:/usr/bin/false
    _iconservices:*:240:240:IconServices:/var/empty:/usr/bin/false
    _distnote:*:241:241:DistNote:/var/empty:/usr/bin/false
    _nsurlsessiond:*:242:242:NSURLSession Daemon:/var/db/nsurlsessiond:/usr/bin/false
    _nsurlstoraged:*:243:243:NSURLStorage Daemon:/var/db/nsurlstoraged:/usr/bin/false
    _displaypolicyd:*:244:244:Display Policy Daemon:/var/empty:/usr/bin/false
    _astris:*:245:245:Astris Services:/var/db/astris:/usr/bin/false
    _krbfast:*:246:-2:Kerberos FAST Account:/var/empty:/usr/bin/false
    _gamecontrollerd:*:247:247:Game Controller Daemon:/var/empty:/usr/bin/false
    _mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
    _ondemand:*:249:249:On Demand Resource Daemon:/var/db/ondemand:/usr/bin/false
    _xserverdocs:*:251:251:macOS Server Documents Service:/var/empty:/usr/bin/false
    _wwwproxy:*:252:252:WWW Proxy:/var/empty:/usr/bin/false
    _mobileasset:*:253:253:MobileAsset User:/var/ma:/usr/bin/false
    _findmydevice:*:254:254:Find My Device Daemon:/var/db/findmydevice:/usr/bin/false
    _datadetectors:*:257:257:DataDetectors:/var/db/datadetectors:/usr/bin/false
    _captiveagent:*:258:258:captiveagent:/var/empty:/usr/bin/false
    _ctkd:*:259:259:ctkd Account:/var/empty:/usr/bin/false
    _applepay:*:260:260:applepay Account:/var/db/applepay:/usr/bin/false
    _hidd:*:261:261:HID Service User:/var/db/hidd:/usr/bin/false
    _cmiodalassistants:*:262:262:CoreMedia IO Assistants User:/var/db/cmiodalassistants:/usr/bin/false
    _analyticsd:*:263:263:Analytics Daemon:/var/db/analyticsd:/usr/bin/false
    _fpsd:*:265:265:FPS Daemon:/var/db/fpsd:/usr/bin/false
    _timed:*:266:266:Time Sync Daemon:/var/db/timed:/usr/bin/false
    xiongweideMacBook-Pro:linux xiongwei$ 

    查看將該文件的所屬者改成root用戶,以下:

    先看一下該用戶的所屬組:

  • 更改文件權限:

    三組rwx分別表明:所屬用戶(user)、所屬分組(group)、其餘(other)。Linux文件權限使用chmod可以修改這三組權限。有兩種設置方法。一種是數字,一種是符號。

    ①、使用數字修改權限:

    我們來試一下改一下剛纔新建的a.txt的權限,先看一下它目前的權限:

    我們能夠將其改成不可讀不可寫:
     
    其中177分別表明user、group、other的權限對應值,對於這個文件而言root權限只有執行權限,但因爲root是一個最高權限,因此這個例子舉得有點不太恰當,得切成其它用戶那就能夠體現出這個權限的效果了,反正瞭解怎麼修復權限是重點。

    ②、使用符號改變權限:
     
    對於修改文件的權限還有用這種符號,我們仍是基於新建的a.txt的user權限進行操做,目前它只有一個可執行權限:

    我們用符號方式去掉其執行權限,以下:

    可是發現貌似group和other的可執行權限也木有了:

    可見該方法是會修改user、group、other三個權限的。

    而後再給它加回來執行權限:

    而後再給它加一個可讀權限:

    這個方法目前是對user、group、other進行統一更改的,那若是隻想對其中一個進行更改呢,就可使用下面的方法:

    我們試一下只給user去掉可讀權限,以下:

    這塊比較簡單,到時須要的時候照着改就成。

  • su和sudo:

    su : 在已登錄的終端(命令行)會話中登錄到另外一個用戶。即 切換用戶。

    su [切換的用戶名] 未輸入用戶名,默認切換到root用戶


    我們來試一下:

    su 和 su -是存在區別的,二者的區別是,前者只切換了身份,然後者至關於從新登錄。su - 從新登錄後目錄切換到用戶配置的工做目錄。什麼意思,我們用「su -」來試一下就明白了:

    sudo:  用戶普通用戶使用root權限來執行命令(不切換用戶)。即臨時提高用戶權限爲root權限,比較簡單,在MAC上謹慎用su來提權,由於若是用su以後的任何修改系統是不涉防的,因此比較危險,遇到沒權限的文件就用sudo來臨時提下權既可。

包管理器:

就是用來裝軟件用的,記錄一下就成:

Mac: brew

Ubuntu: apt

Centos: yum

VI/VIM:

關於它基本也是熟能生巧,聽說大神都是用它來編程的。。對於我來講知道基本的使用就成了,下面簡單回顧一下,反正也記不住,下圖已經詳細進行了介紹:

總的來講是分爲三種模式,分別是命令模式輸入模式底線命令模式,以下:

命令模式

用戶剛剛啓動 vi/vim,便進入了命令模式。

此狀態下敲擊鍵盤動做會被Vim識別爲命令,而非輸入字符。好比咱們此時按下i,並不會輸入一個字符,i被看成了一個命令。

經常使用的命令:

  • i 切換到輸入模式,以輸入字符。

  • x 刪除當前光標所在處的字符。

  • : 切換到底線命令模式,以在最底一行輸入命令。

輸入模式

在輸入模式中,可使用如下按鍵:

  • 字符按鍵以及Shift組合,輸入字符

  • ENTER,回車鍵,換行

  • BACK SPACE,退格鍵,刪除光標前一個字符

  • DEL,刪除鍵,刪除光標後一個字符

  • 方向鍵,在文本中移動光標

  • HOME/END,移動光標到行首/行尾

  • Page Up/Page Down,上/下翻頁

  • Insert,切換光標爲輸入/替換模式,光標將變成豎線/下劃線

  • ESC,退出輸入模式,切換到命令模式

底線命令模式

命令模式下按下:(英文冒號)就進入了底線命令模式。

  • q 退出程序
  • w 保存文件
  • wq 保存並退出
  • q! wq! !:表示強制

iptables防火牆:【瞭解既可】

一、Ubuntu 默認有裝iptables,可經過which iptables確認

二、Ubuntu默認沒有iptables配置文件,可經過iptables-save > /etc/iptables.up.rules生成

三、讀取配置並生效能夠經過 iptables-restore < /etc/iptables.up.rules 

四、vim /etc/network/interfaces 增長

pre-up iptables-restore < /etc/iptables.up.rules #啓動時應用防火牆  
post-down iptables-save > /etc/iptables.up.rules #關閉時保存防火牆設置,以便下次啓動時使用 

iptables-save > /etc/iptables.up.rules 內容相似:

# Generated by iptables-save v1.6.0 on Mon Aug 27 12:34:05 2018
*filter
# DROP 表示關閉、ACCPET表示容許
:INPUT DROP [11:722]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [29:2664]
#開發 22和80801 端口
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
COMMIT
# Completed on Mon Aug 27 12:34:05 2018  

經常使用操做:

#查看當前防火牆配置並顯示規則行號
iptables -L --line-numbers
#開啓 8080 端口
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
#關閉 8888 端口
iptables -A INPUT -p tcp -m tcp --dport 8888 -j DROP
#刪除 1 號 規則(行號)
iptables -D INPUT 1
相關文章
相關標籤/搜索