From b67b4eef13adb0f8a3e1af56eaf84acd38c13699 Mon Sep 17 00:00:00 2001 From: Simon Let Date: Sun, 11 Aug 2019 16:21:13 +0200 Subject: [PATCH] sanitizer works --- common/resh-common.go | 3 + sanitize-history/resh-sanitize-history.go | 222 +- sanitizer_data/path_whitelist.txt | 23 - sanitizer_data/whitelist.txt | 3001 ++++++++++++++++++++- 4 files changed, 3173 insertions(+), 76 deletions(-) delete mode 100644 sanitizer_data/path_whitelist.txt diff --git a/common/resh-common.go b/common/resh-common.go index aa2bb92..0de34ea 100644 --- a/common/resh-common.go +++ b/common/resh-common.go @@ -60,6 +60,9 @@ type Record struct { ReshUuid string `json:"reshUuid"` ReshVersion string `json:"reshVersion"` ReshRevision string `json:"reshRevision"` + + // added by sanitizatizer + CmdLength int `json:"cmdLength"` } type Config struct { diff --git a/sanitize-history/resh-sanitize-history.go b/sanitize-history/resh-sanitize-history.go index cd5b8bb..92d3cbe 100644 --- a/sanitize-history/resh-sanitize-history.go +++ b/sanitize-history/resh-sanitize-history.go @@ -3,6 +3,7 @@ package main import ( "bufio" "crypto/sha1" + "encoding/binary" "encoding/hex" "encoding/json" "errors" @@ -14,10 +15,11 @@ import ( "os/user" "path" "path/filepath" + "strconv" "strings" + "unicode" "github.com/curusarn/resh/common" - "github.com/mattn/go-shellwords" giturls "github.com/whilp/git-urls" ) @@ -48,7 +50,7 @@ func main() { fmt.Println(Revision) os.Exit(0) } - sanitizer := sanitizer{} + sanitizer := sanitizer{hashLength: 4} err := sanitizer.init(sanitizerDataPath) if err != nil { log.Fatal("Sanitizer init() error:", err) @@ -70,7 +72,7 @@ func main() { log.Println("Line:", line) return } - err = sanitizer.sanitize(&record) + err = sanitizer.sanitizeRecord(&record) if err != nil { log.Println("Sanitization error:", err) log.Println("Line:", line) @@ -87,16 +89,13 @@ func main() { } type sanitizer struct { - GlobalWhitelist map[string]bool - PathWhitelist map[string]bool - // CmdWhitelist []string + hashLength int + whitelist map[string]bool } func (s *sanitizer) init(dataPath string) error { globalData := path.Join(dataPath, "whitelist.txt") - s.GlobalWhitelist = loadData(globalData) - pathData := path.Join(dataPath, "path_whitelist.txt") - s.PathWhitelist = loadData(pathData) + s.whitelist = loadData(globalData) return nil } @@ -116,7 +115,7 @@ func loadData(fname string) map[string]bool { return data } -func (s *sanitizer) sanitize(record *common.Record) error { +func (s *sanitizer) sanitizeRecord(record *common.Record) error { record.Pwd = s.sanitizePath(record.Pwd) record.RealPwd = s.sanitizePath(record.RealPwd) record.PwdAfter = s.sanitizePath(record.PwdAfter) @@ -126,51 +125,109 @@ func (s *sanitizer) sanitize(record *common.Record) error { record.Home = s.sanitizePath(record.Home) record.ShellEnv = s.sanitizePath(record.ShellEnv) - record.Host = s.sanitizeTokenDontUseWhitelist(record.Host) - record.Uname = s.sanitizeTokenDontUseWhitelist(record.Uname) - record.Login = s.sanitizeTokenDontUseWhitelist(record.Login) - record.MachineId = s.sanitizeTokenDontUseWhitelist(record.MachineId) + record.Host = s.hashToken(record.Host) + record.Login = s.hashToken(record.Login) + record.MachineId = s.hashToken(record.MachineId) var err error + // this changes git url a bit but I'm still happy with the result + // e.g. "git@github.com:curusarn/resh" becomes "ssh://git@github.com/3385162f14d7/5a7b2909005c" + // notice the "ssh://" prefix record.GitOriginRemote, err = s.sanitizeGitURL(record.GitOriginRemote) if err != nil { log.Println("Error while snitizing GitOriginRemote url", record.GitOriginRemote, ":", err) return err } - fmt.Println("....") - parser := shellwords.NewParser() + // sanitization destroys original CmdLine length -> save it + record.CmdLength = len(record.CmdLine) - args, err := parser.Parse(record.CmdLine) + record.CmdLine, err = s.sanitizeCmdLine(record.CmdLine) if err != nil { - log.Println("Parsing error @ position", parser.Position, ":", err) - log.Println("CmdLine:", record.CmdLine) - return err + log.Fatal("Cmd:", record.CmdLine, "; sanitization error:", err) } - fmt.Println(args) - return nil +} - // var tokens []string - // word := "" - // for _, char := range strings.Split(, "") { - // if unicode.IsSpace([]rune(char)[0]) { - // if len(word) > 0 { - // tokens = append(tokens, word) - // word = "" - // } - // tokens = append(tokens, char) - // } else { - // word += char - // } - // } - // if len(word) > 0 { - // tokens = append(tokens, word) - // } - // for _, token := range tokens { - // fmt.Println(token) - // } - // return nil +func (s *sanitizer) sanitizeCmdLine(cmdLine string) (string, error) { + sanCmdLine := "" + buff := "" + + // simple options shouldn't be sanitized + // 1) whitespace 2) "-" or "--" 3) letters, digits, "-", "_" 4) ending whitespace or "=" + var optionDetected bool + + prevR3 := ' ' + prevR2 := ' ' + prevR := ' ' + for _, r := range cmdLine { + switch optionDetected { + case true: + if unicode.IsSpace(r) || r == '=' || r == ';' { + // whitespace, "=" or ";" ends the option + // => add option unsanitized + optionDetected = false + if len(buff) > 0 { + sanCmdLine += buff + buff = "" + } + sanCmdLine += string(r) + } else if unicode.IsLetter(r) == false && unicode.IsDigit(r) == false && r != '-' && r != '_' { + // r is not any of allowed chars for an option: letter, digit, "-" or "_" + // => sanitize + if len(buff) > 0 { + sanToken, err := s.sanitizeCmdToken(buff) + if err != nil { + return cmdLine, err + } + sanCmdLine += sanToken + buff = "" + } + sanCmdLine += string(r) + } else { + buff += string(r) + } + case false: + // split command on all non-letter and non-digit characters + if unicode.IsLetter(r) == false && unicode.IsDigit(r) == false { + // split token + if len(buff) > 0 { + sanToken, err := s.sanitizeCmdToken(buff) + if err != nil { + return cmdLine, err + } + sanCmdLine += sanToken + buff = "" + } + sanCmdLine += string(r) + } else { + if (unicode.IsSpace(prevR2) && prevR == '-') || + (unicode.IsSpace(prevR3) && prevR2 == '-' && prevR == '-') { + optionDetected = true + } + buff += string(r) + } + } + prevR3 = prevR2 + prevR2 = prevR + prevR = r + } + if len(buff) <= 0 { + // nothing in the buffer => work is done + return sanCmdLine, nil + } + if optionDetected { + // option detected => dont sanitize + sanCmdLine += buff + return sanCmdLine, nil + } + // sanitize + sanToken, err := s.sanitizeCmdToken(buff) + if err != nil { + return cmdLine, err + } + sanCmdLine += sanToken + return sanCmdLine, nil } func (s *sanitizer) sanitizeGitURL(rawURL string) (string, error) { @@ -216,8 +273,8 @@ func (s *sanitizer) sanitizeParsedURL(parsedURL *url.URL) (string, error) { func (s *sanitizer) sanitizePath(path string) string { var sanPath string for _, token := range strings.Split(path, "/") { - if s.PathWhitelist[token] != true { - token = s.sanitizeToken(token) + if s.whitelist[token] != true { + token = s.hashToken(token) } sanPath += token + "/" } @@ -238,19 +295,55 @@ func (s *sanitizer) sanitizeTwoPartToken(token string, delimeter string) (string return token, errors.New("Token has more than two parts") } -func (s *sanitizer) sanitizeToken(token string) string { - return s._sanitizeToken(token, true) -} +func (s *sanitizer) sanitizeCmdToken(token string) (string, error) { + // there shouldn't be tokens with letters or digits mixed together with symbols + if len(token) <= 0 { + return token, nil + } + if s.whitelist[token] == true { + return token, nil + } -func (s *sanitizer) sanitizeTokenDontUseWhitelist(token string) string { - return s._sanitizeToken(token, false) + isLettersOrDigits := true + isDigits := true + isOtherCharacters := true + for _, r := range token { + if unicode.IsDigit(r) == false && unicode.IsLetter(r) == false { + isLettersOrDigits = false + isDigits = false + } + if unicode.IsDigit(r) == false { + isDigits = false + } + if unicode.IsDigit(r) || unicode.IsLetter(r) { + isOtherCharacters = false + } + } + if isDigits { + return s.hashNumericToken(token), nil + } + if isLettersOrDigits { + return s.hashToken(token), nil + } + if isOtherCharacters { + return token, nil + } + log.Println("token:", token) + return token, errors.New("cmd token is made of mix of letters or digits and other characters") } -func (s *sanitizer) _sanitizeToken(token string, useWhitelist bool) string { +func (s *sanitizer) sanitizeToken(token string) string { if len(token) <= 0 { return token } - if useWhitelist == true && s.GlobalWhitelist[token] == true { + if s.whitelist[token] { + return token + } + return s.hashToken(token) +} + +func (s *sanitizer) hashToken(token string) string { + if len(token) <= 0 { return token } // hash with sha1 @@ -258,5 +351,30 @@ func (s *sanitizer) _sanitizeToken(token string, useWhitelist bool) string { h := sha1.New() h.Write([]byte(token)) sum := h.Sum(nil) - return hex.EncodeToString(sum)[:12] + // TODO: extend hashes to 12 + return s.trimHash(hex.EncodeToString(sum)) +} + +func (s *sanitizer) hashNumericToken(token string) string { + if len(token) <= 0 { + return token + } + // hash with fnv + // trim to 12 characters + h := sha1.New() + h.Write([]byte(token)) + sum := h.Sum(nil) + sumInt := int(binary.LittleEndian.Uint64(sum)) + if sumInt < 0 { + return strconv.Itoa(sumInt * -1) + } + return s.trimHash(strconv.Itoa(sumInt)) +} + +func (s *sanitizer) trimHash(hash string) string { + length := s.hashLength + if length <= 0 || len(hash) < length { + length = len(hash) + } + return hash[:length] } diff --git a/sanitizer_data/path_whitelist.txt b/sanitizer_data/path_whitelist.txt deleted file mode 100644 index 75c1ac1..0000000 --- a/sanitizer_data/path_whitelist.txt +++ /dev/null @@ -1,23 +0,0 @@ - -. -.. -bin -boot -dev -etc -home -lib -lib64 -lost+found -media -mnt -opt -proc -root -run -sbin -srv -sys -tmp -usr -var diff --git a/sanitizer_data/whitelist.txt b/sanitizer_data/whitelist.txt index fb1776c..debb8fd 100644 --- a/sanitizer_data/whitelist.txt +++ b/sanitizer_data/whitelist.txt @@ -25,4 +25,3003 @@ bash zsh fish github.com -git \ No newline at end of file +git +bash +bunzip2 +bzcat +bzcmp +bzdiff +bzegrep +bzexe +bzfgrep +bzgrep +bzip2 +bzip2recover +bzless +bzmore +cat +chgrp +chmod +chown +cp +dash +date +dd +df +dir +dmesg +dnsdomainname +domainname +echo +egrep +false +fgrep +findmnt +grep +gunzip +gzexe +gzip +hostname +kill +ln +login +ls +lsblk +mkdir +mknod +mktemp +more +mount +mountpoint +mv +nisdomainname +pidof +ps +pwd +rbash +readlink +rm +rmdir +run-parts +sed +sh +sh.distrib +sleep +stty +su +sync +tar +tempfile +touch +true +umount +uname +uncompress +vdir +wdctl +which +ypdomainname +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew +agetty +badblocks +blkdiscard +blkid +blockdev +cfdisk +chcpu +ctrlaltdel +debugfs +dumpe2fs +e2fsck +e2image +e2label +e2undo +fdisk +findfs +fsck +fsck.cramfs +fsck.ext2 +fsck.ext3 +fsck.ext4 +fsck.minix +fsfreeze +fstab-decode +fstrim +getty +hwclock +initctl +installkernel +isosize +killall5 +ldconfig +ldconfig.real +logsave +losetup +mke2fs +mkfs +mkfs.bfs +mkfs.cramfs +mkfs.ext2 +mkfs.ext3 +mkfs.ext4 +mkfs.minix +mkhomedir_helper +mkswap +pam_extrausers_chkpwd +pam_extrausers_update +pam_tally +pam_tally2 +pivot_root +raw +resize2fs +runuser +sfdisk +shadowconfig +start-stop-daemon +sulogin +swaplabel +swapoff +swapon +switch_root +sysctl +tune2fs +unix_chkpwd +unix_update +wipefs +zramctl +[ +addpart +apt +apt-cache +apt-cdrom +apt-config +apt-get +apt-key +apt-mark +arch +awk +b2sum +base32 +base64 +basename +bashbug +captoinfo +catchsegv +chage +chattr +chcon +chfn +chrt +chsh +cksum +clear +clear_console +cmp +comm +csplit +cut +deb-systemd-helper +deb-systemd-invoke +debconf +debconf-apt-progress +debconf-communicate +debconf-copydb +debconf-escape +debconf-set-selections +debconf-show +delpart +diff +diff3 +dircolors +dirname +dpkg +dpkg-deb +dpkg-divert +dpkg-maintscript-helper +dpkg-query +dpkg-split +dpkg-statoverride +dpkg-trigger +du +env +expand +expiry +expr +factor +faillog +fallocate +find +flock +fmt +fold +free +getconf +getent +getopt +gpasswd +gpgv +groups +head +hostid +i386 +iconv +id +infocmp +infotocap +install +ionice +ipcmk +ipcrm +ipcs +ischroot +join +last +lastb +lastlog +ldd +link +linux32 +linux64 +locale +locale-check +localedef +logger +logname +lsattr +lscpu +lsipc +lslocks +lslogins +lsmem +lsns +mawk +mcookie +md5sum +md5sum.textutils +mesg +mkfifo +namei +nawk +newgrp +nice +nl +nohup +nproc +nsenter +numfmt +od +pager +partx +passwd +paste +pathchk +perl +perl5.26.1 +pgrep +pinky +pkill +pldd +pmap +pr +printenv +printf +prlimit +ptx +pwdx +realpath +rename.ul +renice +reset +resizepart +rev +rgrep +runcon +savelog +script +scriptreplay +sdiff +select-editor +sensible-browser +sensible-editor +sensible-pager +seq +setarch +setsid +setterm +sg +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +shred +shuf +skill +slabtop +snice +sort +split +stat +stdbuf +sum +tabs +tac +tail +taskset +tee +test +tic +timeout +tload +toe +top +touch +tput +tr +truncate +tset +tsort +tty +tzselect +unexpand +uniq +unlink +unshare +update-alternatives +uptime +users +utmpdump +vmstat +w +w.procps +wall +watch +wc +whereis +which +who +whoami +x86_64 +xargs +yes +zdump +unminimize +add-shell +addgroup +adduser +chgpasswd +chmem +chpasswd +chroot +cpgr +cppw +delgroup +deluser +dpkg-preconfigure +dpkg-reconfigure +e2freefrag +e4crypt +e4defrag +fdformat +filefrag +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +iconvconfig +invoke-rc.d +ldattach +mklost+found +newusers +nologin +pam-auth-update +pam_getenv +pam_timestamp_check +policy-rc.d +pwck +pwconv +pwunconv +readprofile +remove-shell +rmt +rmt-tar +rtcwake +service +tarcat +update-passwd +update-rc.d +useradd +userdel +usermod +vigr +vipw +zic +docker +go +ssh +cz +com +http +https +localhost +jq +code +make +ping +ffmpeg +add-shell +addgroup +adduser +arpd +chgpasswd +chmem +chpasswd +chroot +cpgr +cppw +delgroup +deluser +dpkg-preconfigure +dpkg-reconfigure +e2freefrag +e4crypt +e4defrag +fdformat +filefrag +genl +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +iconvconfig +invoke-rc.d +ldattach +mklost+found +newusers +nologin +pam-auth-update +pam_getenv +pam_timestamp_check +policy-rc.d +pwck +pwconv +pwunconv +readprofile +remove-shell +rmt +rmt-tar +rtcwake +service +tarcat +tzconfig +update-passwd +update-rc.d +useradd +userdel +usermod +vigr +vipw +zic +[ +addpart +apt +apt-cache +apt-cdrom +apt-config +apt-get +apt-key +apt-mark +arch +awk +b2sum +base32 +base64 +basename +bashbug +captoinfo +catchsegv +chage +chattr +chcon +chfn +choom +chrt +chsh +cksum +clear +clear_console +cmp +comm +csplit +ctstat +cut +deb-systemd-helper +deb-systemd-invoke +debconf +debconf-apt-progress +debconf-communicate +debconf-copydb +debconf-escape +debconf-set-selections +debconf-show +delpart +diff +diff3 +dircolors +dirname +dpkg +dpkg-deb +dpkg-divert +dpkg-maintscript-helper +dpkg-query +dpkg-split +dpkg-statoverride +dpkg-trigger +du +env +expand +expiry +expr +factor +faillog +fallocate +fincore +find +flock +fmt +fold +getconf +getent +getopt +gpasswd +gpgv +groups +head +hostid +i386 +iconv +id +infocmp +infotocap +install +ionice +ipcmk +ipcrm +ipcs +ischroot +join +last +lastb +lastlog +ldd +link +linux32 +linux64 +lnstat +locale +localedef +logger +logname +lsattr +lscpu +lsipc +lslocks +lslogins +lsmem +lsns +mawk +mcookie +md5sum +md5sum.textutils +mesg +mkfifo +namei +nawk +newgrp +nice +nl +nohup +nproc +nsenter +nstat +numfmt +od +pager +partx +passwd +paste +pathchk +perl +perl5.28.1 +pinky +pldd +pr +printenv +printf +prlimit +ptx +rdma +realpath +rename.ul +renice +reset +resizepart +rev +rgrep +routef +routel +rtstat +runcon +savelog +script +scriptreplay +sdiff +seq +setarch +setpriv +setsid +setterm +sg +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +shred +shuf +sort +split +stat +stdbuf +sum +tabs +tac +tail +taskset +tee +test +tic +timeout +toe +touch +tput +tr +truncate +tset +tsort +tty +tzselect +unexpand +uniq +unlink +unshare +update-alternatives +users +utmpdump +wall +wc +whereis +which +who +whoami +x86_64 +xargs +yes +zdump +agetty +badblocks +blkdiscard +blkid +blkzone +blockdev +bridge +capsh +cfdisk +chcpu +ctrlaltdel +debugfs +devlink +dumpe2fs +e2fsck +e2image +e2label +e2mmpstatus +e2undo +fdisk +findfs +fsck +fsck.cramfs +fsck.ext2 +fsck.ext3 +fsck.ext4 +fsck.minix +fsfreeze +fstab-decode +fstrim +getcap +getpcaps +getty +hwclock +installkernel +ip +isosize +killall5 +ldconfig +logsave +losetup +mke2fs +mkfs +mkfs.bfs +mkfs.cramfs +mkfs.ext2 +mkfs.ext3 +mkfs.ext4 +mkfs.minix +mkhomedir_helper +mkswap +pam_tally +pam_tally2 +pivot_root +raw +resize2fs +rtacct +rtmon +runuser +setcap +sfdisk +shadowconfig +start-stop-daemon +sulogin +swaplabel +swapoff +swapon +switch_root +tc +tipc +tune2fs +unix_chkpwd +unix_update +wipefs +zramctl +bash +cat +chgrp +chmod +chown +cp +dash +date +dd +df +dir +dmesg +dnsdomainname +domainname +echo +egrep +false +fgrep +findmnt +grep +gunzip +gzexe +gzip +hostname +ip +ln +login +ls +lsblk +mkdir +mknod +mktemp +more +mount +mountpoint +mv +nisdomainname +pidof +ping +ping4 +ping6 +pwd +rbash +readlink +rm +rmdir +run-parts +sed +sh +sleep +ss +stty +su +sync +tar +tempfile +touch +true +umount +uname +uncompress +vdir +wdctl +which +ypdomainname +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew +addgnupghome +addpart +adduser +agetty +alternatives +applygnupgdefaults +blkdeactivate +blkdiscard +blkid +blkzone +blockdev +build-locale-archive +capsh +cfdisk +chcpu +chgpasswd +chpasswd +chroot +clock +cracklib-check +cracklib-format +cracklib-packer +cracklib-unpacker +create-cracklib-dict +ctrlaltdel +delpart +dmfilemapd +dmsetup +dmstats +faillock +fdformat +fdisk +findfs +fsck +fsck.cramfs +fsck.minix +fsfreeze +fstrim +g13-syshelp +getcap +getpcaps +glibc_post_upgrade.x86_64 +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +halt +hwclock +iconvconfig +init +ldattach +ldconfig +losetup +mkfs +mkfs.cramfs +mkfs.minix +mkhomedir_helper +mkswap +newusers +nologin +pam_console_apply +pam_timestamp_check +partx +pivot_root +poweroff +pwck +pwconv +pwhistory_helper +pwunconv +readprofile +reboot +resizepart +resolvconf +rfkill +rtcwake +runlevel +runuser +sasldblistusers2 +saslpasswd2 +setcap +sfdisk +shutdown +sulogin +swaplabel +swapoff +swapon +switch_root +telinit +unbound-anchor +unix_chkpwd +unix_update +update-alternatives +useradd +userdel +usermod +vigr +vipw +visudo +wipefs +zdump +zic +zramctl +[ +alias +applydeltarpm +arch +awk +b2sum +base32 +base64 +basename +basenc +bash +bashbug +bashbug-64 +bg +brotli +busctl +ca-legacy +cal +captoinfo +cat +catchsegv +cd +chacl +chage +chcon +chgrp +chmem +chmod +choom +chown +chrt +cksum +clear +cmp +col +colcrt +colrm +column +combinedeltarpm +comm +command +coredumpctl +cp +csplit +curl +cut +cvtsudoers +date +db_archive +db_checkpoint +db_deadlock +db_dump +db_dump185 +db_hotbackup +db_load +db_log_verify +db_printlog +db_recover +db_replicate +db_stat +db_tuner +db_upgrade +db_verify +dbus-broker +dbus-broker-launch +dd +df +diff +diff3 +dir +dircolors +dirmngr +dirmngr-client +dirname +dmesg +dnf +dnf-3 +du +easy_install-3.7 +echo +egrep +eject +env +evmctl +ex +expand +expr +factor +fallocate +false +fc +fg +fgrep +fincore +findmnt +fips-finish-install +fips-mode-setup +flock +fmt +fold +g13 +gapplication +gawk +gdbus +gencat +getconf +getent +getfacl +getopt +getopts +gio +gio-launch-desktop +gio-querymodules-64 +glib-compile-schemas +gpasswd +gpg +gpg-agent +gpg-connect-agent +gpg-error +gpg-wks-server +gpg-zip +gpg2 +gpgconf +gpgme-json +gpgparsemail +gpgsplit +gpgv +gpgv2 +grep +groups +gsettings +gtar +gunzip +gzexe +gzip +hash +head +hexdump +hostid +hostnamectl +i386 +iconv +id +infocmp +infotocap +install +ionice +ipcmk +ipcrm +ipcs +isosize +jobs +join +journalctl +kill +last +lastb +lastlog +ldd +link +linux32 +linux64 +ln +locale +localectl +localedef +logger +login +loginctl +logname +look +ls +lsblk +lscpu +lsipc +lslocks +lslogins +lsmem +lsns +make-dummy-cert +makedb +makedeltarpm +mcookie +md5sum +mesg +mkdir +mkfifo +mknod +mkpasswd +mktemp +modulemd-validator-v1 +more +mount +mountpoint +mv +namei +networkctl +newgidmap +newgrp +newuidmap +nice +nl +nohup +nproc +nsenter +numfmt +od +openssl +p11-kit +paste +pathchk +pinky +pip-3 +pip-3.7 +pip3 +pip3.7 +pldd +portablectl +pr +printenv +printf +prlimit +ptx +pwd +pwmake +pwscore +pydoc3 +pydoc3.7 +python3 +python3.7 +python3.7m +pyvenv +pyvenv-3.7 +raw +read +readlink +realpath +rename +renew-dummy-cert +renice +reset +resolvectl +rev +rm +rmdir +rpm +rpm2archive +rpm2cpio +rpmdb +rpmdumpheader +rpmkeys +rpmquery +rpmverify +runcon +rvi +rview +script +scriptreplay +sdiff +sed +seq +setarch +setfacl +setpriv +setsid +setterm +sg +sh +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +shred +shuf +sleep +sort +sotruss +split +sprof +stat +stdbuf +stty +su +sudo +sudoedit +sudoreplay +sum +sync +systemctl +systemd-analyze +systemd-ask-password +systemd-cat +systemd-cgls +systemd-cgtop +systemd-delta +systemd-detect-virt +systemd-escape +systemd-firstboot +systemd-id128 +systemd-inhibit +systemd-machine-id-setup +systemd-mount +systemd-notify +systemd-path +systemd-resolve +systemd-run +systemd-socket-activate +systemd-stdio-bridge +systemd-sysusers +systemd-tmpfiles +systemd-tty-ask-password-agent +systemd-umount +tabs +tac +tail +tar +taskset +tee +test +tic +timedatectl +timeout +toe +touch +tput +tr +true +truncate +trust +tset +tsort +tty +type +tzselect +ul +ulimit +umask +umount +unalias +uname +uname26 +unexpand +uniq +unlink +unshare +update-ca-trust +update-crypto-policies +users +utmpdump +uuidgen +uuidparse +vdir +vi +view +wait +wall +watchgnupg +wc +wdctl +whereis +who +whoami +write +x86_64 +xmlcatalog +xmllint +xmlwf +yes +yum +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew +addgnupghome +addpart +adduser +agetty +alternatives +applygnupgdefaults +blkdeactivate +blkdiscard +blkid +blkzone +blockdev +build-locale-archive +capsh +cfdisk +chcpu +chgpasswd +chpasswd +chroot +clock +cracklib-check +cracklib-format +cracklib-packer +cracklib-unpacker +create-cracklib-dict +ctrlaltdel +delpart +dmfilemapd +dmsetup +dmstats +faillock +fdformat +fdisk +findfs +fsck +fsck.cramfs +fsck.minix +fsfreeze +fstrim +g13-syshelp +getcap +getpcaps +glibc_post_upgrade.x86_64 +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +halt +hwclock +iconvconfig +init +ldattach +ldconfig +losetup +mkfs +mkfs.cramfs +mkfs.minix +mkhomedir_helper +mkswap +newusers +nologin +pam_console_apply +pam_timestamp_check +partx +pivot_root +poweroff +pwck +pwconv +pwhistory_helper +pwunconv +readprofile +reboot +resizepart +resolvconf +rfkill +rtcwake +runlevel +runuser +sasldblistusers2 +saslpasswd2 +setcap +sfdisk +shutdown +sulogin +swaplabel +swapoff +swapon +switch_root +telinit +unbound-anchor +unix_chkpwd +unix_update +update-alternatives +useradd +userdel +usermod +vigr +vipw +visudo +wipefs +zdump +zic +zramctl +[ +alias +applydeltarpm +arch +awk +b2sum +base32 +base64 +basename +basenc +bash +bashbug +bashbug-64 +bg +brotli +busctl +ca-legacy +cal +captoinfo +cat +catchsegv +cd +chacl +chage +chcon +chgrp +chmem +chmod +choom +chown +chrt +cksum +clear +cmp +col +colcrt +colrm +column +combinedeltarpm +comm +command +coredumpctl +cp +csplit +curl +cut +cvtsudoers +date +db_archive +db_checkpoint +db_deadlock +db_dump +db_dump185 +db_hotbackup +db_load +db_log_verify +db_printlog +db_recover +db_replicate +db_stat +db_tuner +db_upgrade +db_verify +dbus-broker +dbus-broker-launch +dd +df +diff +diff3 +dir +dircolors +dirmngr +dirmngr-client +dirname +dmesg +dnf +dnf-3 +du +easy_install-3.7 +echo +egrep +eject +env +evmctl +ex +expand +expr +factor +fallocate +false +fc +fg +fgrep +fincore +findmnt +fips-finish-install +fips-mode-setup +flock +fmt +fold +g13 +gapplication +gawk +gdbus +gencat +getconf +getent +getfacl +getopt +getopts +gio +gio-launch-desktop +gio-querymodules-64 +glib-compile-schemas +gpasswd +gpg +gpg-agent +gpg-connect-agent +gpg-error +gpg-wks-server +gpg-zip +gpg2 +gpgconf +gpgme-json +gpgparsemail +gpgsplit +gpgv +gpgv2 +grep +groups +gsettings +gtar +gunzip +gzexe +gzip +hash +head +hexdump +hostid +hostnamectl +i386 +iconv +id +infocmp +infotocap +install +ionice +ipcmk +ipcrm +ipcs +isosize +jobs +join +journalctl +kill +last +lastb +lastlog +ldd +link +linux32 +linux64 +ln +locale +localectl +localedef +logger +login +loginctl +logname +look +ls +lsblk +lscpu +lsipc +lslocks +lslogins +lsmem +lsns +make-dummy-cert +makedb +makedeltarpm +mcookie +md5sum +mesg +mkdir +mkfifo +mknod +mkpasswd +mktemp +modulemd-validator-v1 +more +mount +mountpoint +mv +namei +networkctl +newgidmap +newgrp +newuidmap +nice +nl +nohup +nproc +nsenter +numfmt +od +openssl +p11-kit +paste +pathchk +pinky +pip-3 +pip-3.7 +pip3 +pip3.7 +pldd +portablectl +pr +printenv +printf +prlimit +ptx +pwd +pwmake +pwscore +pydoc3 +pydoc3.7 +python3 +python3.7 +python3.7m +pyvenv +pyvenv-3.7 +raw +read +readlink +realpath +rename +renew-dummy-cert +renice +reset +resolvectl +rev +rm +rmdir +rpm +rpm2archive +rpm2cpio +rpmdb +rpmdumpheader +rpmkeys +rpmquery +rpmverify +runcon +rvi +rview +script +scriptreplay +sdiff +sed +seq +setarch +setfacl +setpriv +setsid +setterm +sg +sh +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +shred +shuf +sleep +sort +sotruss +split +sprof +stat +stdbuf +stty +su +sudo +sudoedit +sudoreplay +sum +sync +systemctl +systemd-analyze +systemd-ask-password +systemd-cat +systemd-cgls +systemd-cgtop +systemd-delta +systemd-detect-virt +systemd-escape +systemd-firstboot +systemd-id128 +systemd-inhibit +systemd-machine-id-setup +systemd-mount +systemd-notify +systemd-path +systemd-resolve +systemd-run +systemd-socket-activate +systemd-stdio-bridge +systemd-sysusers +systemd-tmpfiles +systemd-tty-ask-password-agent +systemd-umount +tabs +tac +tail +tar +taskset +tee +test +tic +timedatectl +timeout +toe +touch +tput +tr +true +truncate +trust +tset +tsort +tty +type +tzselect +ul +ulimit +umask +umount +unalias +uname +uname26 +unexpand +uniq +unlink +unshare +update-ca-trust +update-crypto-policies +users +utmpdump +uuidgen +uuidparse +vdir +vi +view +wait +wall +watchgnupg +wc +wdctl +whereis +who +whoami +write +x86_64 +xmlcatalog +xmllint +xmlwf +yes +yum +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew +addgnupghome +addpart +adduser +agetty +alternatives +applygnupgdefaults +arping +blkdeactivate +blkdiscard +blkid +blockdev +build-locale-archive +capsh +cfdisk +chcpu +chkconfig +chpasswd +chroot +clock +clockdiff +cracklib-check +cracklib-format +cracklib-packer +cracklib-unpacker +create-cracklib-dict +ctrlaltdel +delpart +depmod +dmfilemapd +dmsetup +dmstats +dracut +faillock +fdformat +fdisk +findfs +fsck +fsck.cramfs +fsck.minix +fsfreeze +fstrim +getcap +getpcaps +glibc_post_upgrade.x86_64 +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +halt +hardlink +hwclock +iconvconfig +iconvconfig.x86_64 +ifenslave +init +insmod +install-info +kpartx +lchage +ldattach +ldconfig +lgroupadd +lgroupdel +lgroupmod +lid +lnewusers +losetup +lpasswd +lsmod +luseradd +luserdel +lusermod +mkdict +mkfs +mkfs.cramfs +mkfs.minix +mkhomedir_helper +mkswap +modinfo +modprobe +newusers +nologin +packer +pam_console_apply +pam_tally2 +pam_timestamp_check +partx +ping6 +pivot_root +poweroff +pwck +pwconv +pwhistory_helper +pwunconv +rdisc +readprofile +reboot +resizepart +rmmod +rtcwake +runlevel +runuser +sasldblistusers2 +saslpasswd2 +sefcontext_compile +setcap +sfdisk +shutdown +sln +sulogin +swaplabel +swapoff +swapon +switch_root +sysctl +telinit +tracepath +tracepath6 +udevadm +unix_chkpwd +unix_update +update-alternatives +useradd +userdel +usermod +vigr +vipw +weak-modules +wipefs +yum-complete-transaction +yumdb +zdump +zic +zramctl +[ +addr2line +alias +ar +arch +as +awk +base64 +basename +bash +bashbug +bashbug-64 +bg +bootctl +busctl +c++filt +ca-legacy +cal +captoinfo +cat +catchsegv +cd +certutil +chacl +chage +chardetect +chcon +chfn +chgrp +chmem +chmod +chown +chrt +chsh +cksum +clear +cmp +cmsutil +col +colcrt +colrm +column +comm +command +coredumpctl +cp +cpio +crlutil +csplit +curl +cut +date +db_archive +db_checkpoint +db_deadlock +db_dump +db_dump185 +db_hotbackup +db_load +db_log_verify +db_printlog +db_recover +db_replicate +db_stat +db_tuner +db_upgrade +db_verify +dbus-binding-tool +dbus-cleanup-sockets +dbus-daemon +dbus-monitor +dbus-run-session +dbus-send +dbus-test-tool +dbus-update-activation-environment +dbus-uuidgen +dd +debuginfo-install +df +dgawk +diff +diff3 +dir +dircolors +dirname +dmesg +dnsdomainname +domainname +dracut +du +dwp +echo +egrep +eject +elfedit +env +ex +expand +expr +factor +fallocate +false +fc +fg +fgrep +find +find-repos-of-install +findmnt +flock +fmt +fold +free +gapplication +gawk +gdbus +gencat +getconf +getent +getfacl +getopt +getopts +gio +gio-querymodules-64 +glib-compile-schemas +gpasswd +gpg +gpg-agent +gpg-connect-agent +gpg-error +gpg-zip +gpg2 +gpgconf +gpgparsemail +gpgsplit +gpgv +gpgv2 +gprof +grep +groups +gsettings +gtar +gunzip +gzexe +gzip +head +hexdump +hostid +hostname +hostnamectl +i386 +iconv +id +idn +igawk +info +infocmp +infokey +infotocap +install +ionice +ipcmk +ipcrm +ipcs +isosize +jobs +join +journalctl +kernel-install +kill +kmod +lastlog +lchfn +lchsh +ld +ld.bfd +ld.gold +ldd +link +linux32 +linux64 +ln +locale +localectl +localedef +logger +login +loginctl +logname +look +ls +lsblk +lscpu +lsinitrd +lsipc +lslocks +lslogins +lsmem +lsns +lua +luac +lz4 +lz4c +lz4cat +machinectl +makedb +mcookie +md5sum +mkdir +mkfifo +mkinitrd +mknod +mktemp +modutil +more +mount +mountpoint +mv +namei +needs-restarting +newgrp +nice +nisdomainname +nl +nm +nohup +nproc +nsenter +numfmt +objcopy +objdump +od +oldfind +p11-kit +package-cleanup +passwd +paste +pathchk +pgawk +pgrep +pinentry +pinentry-curses +ping +ping6 +pinky +pk12util +pkg-config +pkill +pldd +pmap +pr +printenv +printf +prlimit +ps +ptx +pwd +pwdx +pwmake +pwscore +pydoc +python +python2 +python2.7 +ranlib +raw +read +readelf +readlink +realpath +rename +renice +repo-graph +repo-rss +repoclosure +repodiff +repomanage +repoquery +reposync +repotrack +reset +rev +rm +rmdir +rpcgen +rpm +rpm2cpio +rpmdb +rpmkeys +rpmquery +rpmverify +runcon +rvi +rview +script +scriptreplay +sdiff +sed +seq +setarch +setfacl +setpriv +setsid +setterm +setup-nsssysinit +setup-nsssysinit.sh +sg +sh +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +show-changed-rco +show-installed +shred +shuf +signtool +signver +size +skill +slabtop +sleep +snice +sort +sotruss +split +sprof +sqlite3 +ssltap +stat +stdbuf +strings +strip +stty +su +sum +sync +systemctl +systemd-analyze +systemd-ask-password +systemd-cat +systemd-cgls +systemd-cgtop +systemd-coredumpctl +systemd-delta +systemd-detect-virt +systemd-escape +systemd-firstboot +systemd-hwdb +systemd-inhibit +systemd-loginctl +systemd-machine-id-setup +systemd-notify +systemd-nspawn +systemd-path +systemd-run +systemd-stdio-bridge +systemd-tmpfiles +systemd-tty-ask-password-agent +tabs +tac +tail +tailf +tar +taskset +tee +test +testgdbm +tic +timedatectl +timeout +tload +toe +top +touch +tput +tr +tracepath +tracepath6 +true +truncate +trust +tset +tsort +tty +tzselect +udevadm +ul +umask +umount +unalias +uname +unexpand +uniq +unlink +unlz4 +unshare +unxz +update-ca-trust +update-mime-database +uptime +urlgrabber +users +utmpdump +uuidgen +vdir +verifytree +vi +view +vmstat +w +wait +watch +watchgnupg +wc +wdctl +whereis +who +whoami +write +x86_64 +xargs +xmlcatalog +xmllint +xmlwf +xz +xzcat +xzcmp +xzdec +xzdiff +xzegrep +xzfgrep +xzgrep +xzless +xzmore +yes +ypdomainname +yum +yum-builddep +yum-config-manager +yum-debug-dump +yum-debug-restore +yum-groups-manager +yumdownloader +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew +addgnupghome +addpart +adduser +agetty +alternatives +applygnupgdefaults +arping +blkdeactivate +blkdiscard +blkid +blockdev +build-locale-archive +capsh +cfdisk +chcpu +chkconfig +chpasswd +chroot +clock +clockdiff +cracklib-check +cracklib-format +cracklib-packer +cracklib-unpacker +create-cracklib-dict +ctrlaltdel +delpart +depmod +dmfilemapd +dmsetup +dmstats +dracut +faillock +fdformat +fdisk +findfs +fsck +fsck.cramfs +fsck.minix +fsfreeze +fstrim +getcap +getpcaps +glibc_post_upgrade.x86_64 +groupadd +groupdel +groupmems +groupmod +grpck +grpconv +grpunconv +halt +hardlink +hwclock +iconvconfig +iconvconfig.x86_64 +ifenslave +init +insmod +install-info +kpartx +lchage +ldattach +ldconfig +lgroupadd +lgroupdel +lgroupmod +lid +lnewusers +losetup +lpasswd +lsmod +luseradd +luserdel +lusermod +mkdict +mkfs +mkfs.cramfs +mkfs.minix +mkhomedir_helper +mkswap +modinfo +modprobe +newusers +nologin +packer +pam_console_apply +pam_tally2 +pam_timestamp_check +partx +ping6 +pivot_root +poweroff +pwck +pwconv +pwhistory_helper +pwunconv +rdisc +readprofile +reboot +resizepart +rmmod +rtcwake +runlevel +runuser +sasldblistusers2 +saslpasswd2 +sefcontext_compile +setcap +sfdisk +shutdown +sln +sulogin +swaplabel +swapoff +swapon +switch_root +sysctl +telinit +tracepath +tracepath6 +udevadm +unix_chkpwd +unix_update +update-alternatives +useradd +userdel +usermod +vigr +vipw +weak-modules +wipefs +yum-complete-transaction +yumdb +zdump +zic +zramctl +[ +addr2line +alias +ar +arch +as +awk +base64 +basename +bash +bashbug +bashbug-64 +bg +bootctl +busctl +c++filt +ca-legacy +cal +captoinfo +cat +catchsegv +cd +certutil +chacl +chage +chardetect +chcon +chfn +chgrp +chmem +chmod +chown +chrt +chsh +cksum +clear +cmp +cmsutil +col +colcrt +colrm +column +comm +command +coredumpctl +cp +cpio +crlutil +csplit +curl +cut +date +db_archive +db_checkpoint +db_deadlock +db_dump +db_dump185 +db_hotbackup +db_load +db_log_verify +db_printlog +db_recover +db_replicate +db_stat +db_tuner +db_upgrade +db_verify +dbus-binding-tool +dbus-cleanup-sockets +dbus-daemon +dbus-monitor +dbus-run-session +dbus-send +dbus-test-tool +dbus-update-activation-environment +dbus-uuidgen +dd +debuginfo-install +df +dgawk +diff +diff3 +dir +dircolors +dirname +dmesg +dnsdomainname +domainname +dracut +du +dwp +echo +egrep +eject +elfedit +env +ex +expand +expr +factor +fallocate +false +fc +fg +fgrep +find +find-repos-of-install +findmnt +flock +fmt +fold +free +gapplication +gawk +gdbus +gencat +getconf +getent +getfacl +getopt +getopts +gio +gio-querymodules-64 +glib-compile-schemas +gpasswd +gpg +gpg-agent +gpg-connect-agent +gpg-error +gpg-zip +gpg2 +gpgconf +gpgparsemail +gpgsplit +gpgv +gpgv2 +gprof +grep +groups +gsettings +gtar +gunzip +gzexe +gzip +head +hexdump +hostid +hostname +hostnamectl +i386 +iconv +id +idn +igawk +info +infocmp +infokey +infotocap +install +ionice +ipcmk +ipcrm +ipcs +isosize +jobs +join +journalctl +kernel-install +kill +kmod +lastlog +lchfn +lchsh +ld +ld.bfd +ld.gold +ldd +link +linux32 +linux64 +ln +locale +localectl +localedef +logger +login +loginctl +logname +look +ls +lsblk +lscpu +lsinitrd +lsipc +lslocks +lslogins +lsmem +lsns +lua +luac +lz4 +lz4c +lz4cat +machinectl +makedb +mcookie +md5sum +mkdir +mkfifo +mkinitrd +mknod +mktemp +modutil +more +mount +mountpoint +mv +namei +needs-restarting +newgrp +nice +nisdomainname +nl +nm +nohup +nproc +nsenter +numfmt +objcopy +objdump +od +oldfind +p11-kit +package-cleanup +passwd +paste +pathchk +pgawk +pgrep +pinentry +pinentry-curses +ping +ping6 +pinky +pk12util +pkg-config +pkill +pldd +pmap +pr +printenv +printf +prlimit +ps +ptx +pwd +pwdx +pwmake +pwscore +pydoc +python +python2 +python2.7 +ranlib +raw +read +readelf +readlink +realpath +rename +renice +repo-graph +repo-rss +repoclosure +repodiff +repomanage +repoquery +reposync +repotrack +reset +rev +rm +rmdir +rpcgen +rpm +rpm2cpio +rpmdb +rpmkeys +rpmquery +rpmverify +runcon +rvi +rview +script +scriptreplay +sdiff +sed +seq +setarch +setfacl +setpriv +setsid +setterm +setup-nsssysinit +setup-nsssysinit.sh +sg +sh +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +show-changed-rco +show-installed +shred +shuf +signtool +signver +size +skill +slabtop +sleep +snice +sort +sotruss +split +sprof +sqlite3 +ssltap +stat +stdbuf +strings +strip +stty +su +sum +sync +systemctl +systemd-analyze +systemd-ask-password +systemd-cat +systemd-cgls +systemd-cgtop +systemd-coredumpctl +systemd-delta +systemd-detect-virt +systemd-escape +systemd-firstboot +systemd-hwdb +systemd-inhibit +systemd-loginctl +systemd-machine-id-setup +systemd-notify +systemd-nspawn +systemd-path +systemd-run +systemd-stdio-bridge +systemd-tmpfiles +systemd-tty-ask-password-agent +tabs +tac +tail +tailf +tar +taskset +tee +test +testgdbm +tic +timedatectl +timeout +tload +toe +top +touch +tput +tr +tracepath +tracepath6 +true +truncate +trust +tset +tsort +tty +tzselect +udevadm +ul +umask +umount +unalias +uname +unexpand +uniq +unlink +unlz4 +unshare +unxz +update-ca-trust +update-mime-database +uptime +urlgrabber +users +utmpdump +uuidgen +vdir +verifytree +vi +view +vmstat +w +wait +watch +watchgnupg +wc +wdctl +whereis +who +whoami +write +x86_64 +xargs +xmlcatalog +xmllint +xmlwf +xz +xzcat +xzcmp +xzdec +xzdiff +xzegrep +xzfgrep +xzgrep +xzless +xzmore +yes +ypdomainname +yum +yum-builddep +yum-config-manager +yum-debug-dump +yum-debug-restore +yum-groups-manager +yumdownloader +zcat +zcmp +zdiff +zegrep +zfgrep +zforce +zgrep +zless +zmore +znew \ No newline at end of file