JNI线程、Linux常用命令、权限、防火墙配置
JNI_OnLoad:
調用System.loadLibrary()函數時, 內部就會去查找so中的 JNI_OnLoad 函數,如果存在此函數則調用。
JNI_OnLoad會:
告訴 VM 此 native 組件使用的 JNI 版本。
? 對應了Java版本,android中只支持JNI_VERSION_1_2 、JNI_VERSION_1_4、JNI_VERSION_1_6,其中JNI_VERSION_1_1這個不能用,用它會報錯的。
? 在JDK1.8有 JNI_VERSION_1_8。
下面咱們來寫一個該函數:
編譯運行:
那要這說這個函數有啥用呢?大有用處,咱們先來看一下該函數的第一個參數:
動態注冊就其中的一個用處,所以接下來看一下學習一下動態注冊。
動態注冊:
在此之前我們一直在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 00000006esi 000007f0 edi 00000000xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007beip b76b2df6 ebp b7717ce0 esp 952c99a0 flags 00200207backtrace:#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.so952c9968 00000000 952c996c b7684f79 /system/lib/libc.so (pthread_mutex_unlock+25)952c9970 b771318c /system/lib/libc.so952c9974 b7921568 [heap]952c9978 00000015 952c997c 00000000 952c9980 00000000 952c9984 b76d1846 /system/lib/libc.so (funlockfile+6)952c9988 b7712fcc /system/lib/libc.so952c998c 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.so952c99ac b768f556 /system/lib/libc.so (pthread_kill+102)952c99b0 000007e2 952c99b4 000007f0 952c99b8 00000006 952c99bc 00000000 952c99c0 b7713268 /system/lib/libc.so952c99c4 00000000 952c99c8 b768f4f9 /system/lib/libc.so (pthread_kill+9)952c99cc b7712fcc /system/lib/libc.so952c99d0 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防火墻:【了解既可】
1、Ubuntu 默認有裝iptables,可通過which iptables確認
2、Ubuntu默認沒有iptables配置文件,可通過iptables-save > /etc/iptables.up.rules生成
3、讀取配置并生效可以通過 iptables-restore < /etc/iptables.up.rules?
4、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?
轉載于:https://www.cnblogs.com/webor2006/p/9863734.html
總結
以上是生活随笔為你收集整理的JNI线程、Linux常用命令、权限、防火墙配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis 3.2.1 centos7
- 下一篇: 数据结构——第一章线性表:01线性表的逻