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过滤去掉,就可以看到堆栈信息了,如下:

111-09 09:29:01.581 2018-2032/? E/dalvikvm: JNI ERROR: non-VM thread making JNI call (GetObjectClass) 2 VM aborting 311-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) 411-09 09:29:01.605 680-686/? I/jdwp: Ignoring second debugger -- accepting and dropping 511-09 09:29:01.625 877-883/? I/jdwp: Ignoring second debugger -- accepting and dropping 611-09 09:29:01.669 1390-1396/? I/jdwp: Ignoring second debugger -- accepting and dropping 711-09 09:29:01.685 222-222/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 8 Build fingerprint: 'generic/vbox86p/vbox86p:4.4.4/KTU84P/14:userdebug/test-keys' 9 Revision: '0' 10 pid: 2018, tid: 2032, name: com.jni.test >>> com.jni.test <<< 1111-09 09:29:01.689 222-222/? I/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 1211-09 09:29:01.701 817-823/? I/jdwp: Ignoring second debugger -- accepting and dropping 1311-09 09:29:01.713 756-762/? I/jdwp: Ignoring second debugger -- accepting and dropping 1411-09 09:29:01.729 572-578/? I/jdwp: Ignoring second debugger -- accepting and dropping 1511-09 09:29:01.741 1469-1475/? I/jdwp: Ignoring second debugger -- accepting and dropping 1611-09 09:29:01.905 226-559/? W/genymotion_audio: out_write() limiting sleep time 1845522210 to 39909 1711-09 09:29:01.957 222-222/? I/DEBUG: eax 00000000 ebx 000007e2 ecx 000007f0 edx 00000006 18 esi 000007f0 edi 00000000 19 xcs 00000073 xds 0000007b xes 0000007b xfs 00000000 xss 0000007b 20 eip b76b2df6 ebp b7717ce0 esp 952c99a0 flags 00200207 21 backtrace: 22 #00 pc 0003bdf6 /system/lib/libc.so (tgkill+22) 23 #01 pc 00000005 <unknown> 24 stack: 2511-09 09:29:01.961 222-222/? I/DEBUG: 952c9960 00000000 26 952c9964 b7713268 /system/lib/libc.so 27 952c9968 00000000 28 952c996c b7684f79 /system/lib/libc.so (pthread_mutex_unlock+25) 29 952c9970 b771318c /system/lib/libc.so 30 952c9974 b7921568 [heap] 31 952c9978 00000015 32 952c997c 00000000 33 952c9980 00000000 34 952c9984 b76d1846 /system/lib/libc.so (funlockfile+6) 35 952c9988 b7712fcc /system/lib/libc.so 36 952c998c b76bce96 /system/lib/libc.so (__sflush_locked+150) 37 952c9990 00000000 38 952c9994 00000000 39 952c9998 b7684da9 /system/lib/libc.so (pthread_mutex_lock+9) 40 952c999c b7712fcc /system/lib/libc.so 41 #00 952c99a0 00000006 42 952c99a4 000007f0 43 952c99a8 b7712fcc /system/lib/libc.so 44 952c99ac b768f556 /system/lib/libc.so (pthread_kill+102) 45 952c99b0 000007e2 46 952c99b4 000007f0 47 952c99b8 00000006 48 952c99bc 00000000 49 952c99c0 b7713268 /system/lib/libc.so 50 952c99c4 00000000 51 952c99c8 b768f4f9 /system/lib/libc.so (pthread_kill+9) 52 952c99cc b7712fcc /system/lib/libc.so 53 952c99d0 952c9a1c [stack:2032] 54 952c99d4 952c9c5c [stack:2032] 55 952c99d8 37900019 56 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中用户都是按组来进行分类的,一个用户属于一个或多个组。文件所有者之外的用户又分为文件所有者的同组用户和其他用户。可以使用以下命令查看当前使用的用户信息:

如下:

  • 更改文件所属:
    这里先介绍命令用法:

    咱们来试验一下,先新建一个目录:

    接下来咱们来修改该文件的所属用户,先查看一下当前系统存在的用户,可以使用如下命令:

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

1pre-up iptables-restore < /etc/iptables.up.rules #启动时应用防火墙 2post-down iptables-save > /etc/iptables.up.rules #关闭时保存防火墙设置,以便下次启动时使用

iptables-save > /etc/iptables.up.rules 内容类似:

1# Generated by iptables-save v1.6.0 on Mon Aug 27 12:34:05 2018 2*filter 3# DROP 表示关闭、ACCPET表示允许 4:INPUT DROP [11:722] 5:FORWARD ACCEPT [0:0] 6:OUTPUT ACCEPT [29:2664] 7#开发 2280801 端口 8-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 9-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT 10COMMIT 11# Completed on Mon Aug 27 12:34:05 2018

常用操作:

1#查看当前防火墙配置并显示规则行号 2iptables -L --line-numbers 3#开启 8080 端口 4iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT 5#关闭 8888 端口 6iptables -A INPUT -p tcp -m tcp --dport 8888 -j DROP 7#删除 1 号 规则(行号) 8iptables -D INPUT 1
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )