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
可以修改這三組權限。有兩種設置方法。一種是數字,一種是符號。
我們能夠將其改成不可讀不可寫:
其中177分別表明user、group、other的權限對應值,對於這個文件而言root權限只有執行權限,但因爲root是一個最高權限,因此這個例子舉得有點不太恰當,得切成其它用戶那就能夠體現出這個權限的效果了,反正瞭解怎麼修復權限是重點。
我們用符號方式去掉其執行權限,以下:
可是發現貌似group和other的可執行權限也木有了:
可見該方法是會修改user、group、other三個權限的。
而後再給它加回來執行權限:
而後再給它加一個可讀權限:
這個方法目前是對user、group、other進行統一更改的,那若是隻想對其中一個進行更改呢,就可使用下面的方法:
我們試一下只給user去掉可讀權限,以下:
這塊比較簡單,到時須要的時候照着改就成。
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