如何获取linux进程的执行文件路径

如何获取linux进程的执行文件路径,第1张

ps查看所有符合/cmd的进程,找出其对应的进程号 用ll命令: ll 进程号 如下显示一个示例: [root@Cluster1 proc]# ll 22401 total 0 -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 cmdline -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 cpu lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 cwd -> /home/zhouys/sbs/bin -r-------- 1 zhouys zhouys 0 Dec 11 11:10 environ lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 exe -> /home/zhouys/sbs/bin/cbs (deleted) dr-x------ 2 zhouys zhouys 0 Dec 11 11:10 fd -r-------- 1 zhouys zhouys 0 Dec 11 11:10 maps -rw------- 1 zhouys zhouys 0 Dec 11 11:10 mem -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 mounts lrwxrwxrwx 1 zhouys zhouys 0 Dec 11 11:10 root -> / -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 stat -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 statm -r--r--r-- 1 zhouys zhouys 0 Dec 11 11:10 status /proc文件系统下的 进程号目录 下面的文件镜像了进程的当前运行信息, 从中可以看到: cwd符号链接的就是进程22401的运行目录; exe符号连接就是执行程序的绝对路径; cmdline就是程序运行时输入的命令行命令;本例为:/cbs cpu记录了进程可能运行在其上的cpu;显示虚拟的cpu信息 environ记录了进程运行时的环境变量 fd目录下是进程打开或使用的文件的符号连接 通过cwd直接进入进程运行目录,通过查看相关信息就可以定位此目录对应那个端口号,以及 定位是那个应用才使用此服务程序。

如果你的JAVA部署的tomcat,就是你要查找文件的服务器,那就用:

File file = new File("文件路径")。

如果你本地的JAVA想要访问远程的一个服务器的文件是否存在,就得用如下方法:

URL url = new URL(“文件路径:可以是本地服务器的路径,也可以是远程服务器的路径”)

>

//message = urlcongetHeaderField(0);

//文件存在‘>

Long TotalSize=LongparseLong(urlcongetHeaderField("Content-Length"));

if (TotalSize>0){

return true;

}else{

return false;

}

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

前天我遇到一个小坑,就是,我百度了一下后,使用sys模块的方法syspath[0]去获取执行路径打包成exe和py文件执行那是两种结果,打包exe后会出现奇怪的路径,所以解决方法是这样子的:

获取本exe执行路径名字应该使用os模块和sys模块去获取

ospathdirname(sysexecutable)

像这样子,就能获取执行的路径了。

如果觉得我的文章对您有帮助,记得帮我点赞加收藏哦,谢谢各位哥哥姐姐们

centos68环境

一、添加ssh端口

vim /etc/ssh/sshd_config

添加最后面两行,第一行要注释掉

#Port 22

#AddressFamily any

#ListenAddress 0000

#ListenAddress ::

listenAddress 0000:22

listenAddress 0000:10220

#重启服务 查看监听

netstat -lntup|grep 22

二、修改配置

#vim /etc/ssh/sshd_config

#Subsystem sftp /usr/libexec/sftp-server //找到此行在前面加#注释掉

添加以下几行

Subsystem sftp internal-sftp

Match Group etcsftp #允许的组

ChrootDirectory %h #%h表示用户根目录全路径,也可以这样ChrootDirectory /home/%u

X11Forwarding no

AllowTcpForwarding no

ForceCommand internal-sftp

#重启服务

三、创建用户 #生产为/home/etcsftp

useradd -d /data/etcsftp -m etcsftp

usermod -s /bin/false etcsftp

#生产密码

echo 'xxxxxx'|passwd etcsftp --stdin

测试密码

echo 'xxxxxx'|passwd etcsftp --stdin

修改权限(不修改外网无法连接)

chown -R rootetcsftp /data/etcsftp/

chmod -R 755 /data/etcsftp/

在根目录下(/data/etcsftp/)建立存放文件的目录(在根目录没有读写权限)

并赋予etcsftp属主属组的权限

chown -R etcsftpetcsftp handled untreated

四、添加用户

useradd -d /data/wukuangsftp -m wukuangsftp

usermod -s /bin/false wukuangsftp

测试密码

echo 'xxxxxx'|passwd wukuangsftp --stdin

生产密码

echo 'xxxxxx'|passwd wukuangsftp --stdin

修改权限(不修改外网无法连接)

chown -R rootwukuangsftp /data/wukuangsftp/

chmod -R 755 /data/wukuangsftp/

在根目录下(/data/wukuangsftp/)建立存放文件的目录(在根目录没有读写权限)

并赋予wukuangsftp属主属组的权限

mkdir upload

chown -R wukuangsftpwukuangsftp upload

添加ssh配置/etc/ssh/sshd_config

Subsystem sftp internal-sftp

#etcsftp

Match Group etcsftp

ChrootDirectory %h

#wukiangsftp

Match Group wukuangsftp

ChrootDirectory %h

X11Forwarding no

AllowTcpForwarding no

ForceCommand internal-sftp

实例句柄这个东西,MSDN说了,就是加载进程映像的基址,每个进程都是一样的,你得到其他的进程也在你自己的进程里用不了。比如,你建立任何一个进程,GetModuleHandle(NULL)函数返回的就是进程的实例句柄,一般都是0x400000(可能少写或多写了一个0)。所以,要得到一个进程的路径,只有一个方法,把自己的代码注入到目标进程的地址空间中,在被注入的代码中使用GetMoudleFileName(GetModuleHandle(NULL),szModPath,MAX_PATH)来得到这个进程的所在路径。

这就涉及到注入进程这个有意思的东西了。简单而易用的方法,就是用《Windows核心编程》中提到的方法,用创建远程线程来把自己的DLL注入到目标进程的方法来实现。创建远程线程用CreateRemoteThread(),很简单,与CreateThread()使用方法一样,只不过多出的第一个参数是目标进程句柄(记住,要有PROCESS_CREATE_THREAD权限),其他的参数,都要是在目标进程的地址空间中的。

基本的流程应该是:

用OpenProcess()函数打开目标进程,权限要有PROCESS_CREATE_THREAD,PROCESS_VM_READ,PROCESS_VM_WRITE。然后用VirtualAllocEx函数在目标进程中分配一个内存空间,这个空间要保存你的Dll文件的路径,然后用WriteProcessMemory把这个字符串写入,再用GetProcAddress得到LoadLibraryA函数的地址,当然得到的地址是自己进程地址空间中的地址,但一般情况下绝大部分进程的这个地址处都是同样的LoadLibraryA函数。利用得到的在目标进程中分配的内存的地址及LoadLibraryA函数,就可以利用创建远程线程的方法把自己的DLL文件注入进去。

只有把自己的代码注入到目标进程中,你才可能利用GetModuleFileName函数得到目标进程的路径。当然这个工作是由已经注入到目标进程中的DLL来做。

package jsch;

import javaioFile;

import javaioFileInputStream;

import javautilProperties;

import comjcraftjschChannel;

import comjcraftjschChannelSftp;

import comjcraftjschJSch;

import comjcraftjschJSchException;

import comjcraftjschSession;

public class Test {

    protected String host;//sftp服务器ip

    protected String username;//用户名

    protected String password;//密码

    protected String privateKey;//密钥文件路径

    protected String passphrase;//密钥口令

    protected int port = 22;//默认的sftp端口号是22

    /

      获取连接

      @return channel

     /

    public ChannelSftp connectSFTP() {

        JSch jsch = new JSch();

        Channel channel = null;

        try {

            if (privateKey != null && !""equals(privateKey)) {

                //使用密钥验证方式,密钥可以使有口令的密钥,也可以是没有口令的密钥

                if (passphrase != null && ""equals(passphrase)) {

                    jschaddIdentity(privateKey, passphrase);

                } else {

                    jschaddIdentity(privateKey);

                }

            }

            Session session = jschgetSession(username, host, port);

            if (password != null && !""equals(password)) {

                sessionsetPassword(password);

            }

            Properties sshConfig = new Properties();

            sshConfigput("StrictHostKeyChecking", "no");// do not verify host key

            sessionsetConfig(sshConfig);

            // sessionsetTimeout(timeout);

            sessionsetServerAliveInterval(92000);

            sessionconnect();

            //参数sftp指明要打开的连接是sftp连接

            channel = sessionopenChannel("sftp");

            channelconnect();

        } catch (JSchException e) {

            eprintStackTrace();

        }

        return (ChannelSftp) channel;

    }

    

    /

      上传文件

      

      @param directory

                 上传的目录

      @param uploadFile

                 要上传的文件

      @param sftp

     /

    public void upload(String directory, String uploadFile, ChannelSftp sftp) {

        try {

            sftpcd(directory);

            File file = new File(uploadFile);

            sftpput(new FileInputStream(file), filegetName());

        } catch (Exception e) {

            eprintStackTrace();

        }

    }

    /

      下载文件

      

      @param directory

                 下载目录

      @param downloadFile

                 下载的文件

      @param saveFile

                 存在本地的路径

      @param sftp

     /

    public void download(String directory, String downloadFile,

            String saveFile, ChannelSftp sftp) {

        try {

            sftpcd(directory);

            sftpget(downloadFile,saveFile);

        } catch (Exception e) {

            eprintStackTrace();

        }

    }

    /

      删除文件

      

      @param directory

                 要删除文件所在目录

      @param deleteFile

                 要删除的文件

      @param sftp

     /

    public void delete(String directory, String deleteFile, ChannelSftp sftp) {

        try {

            sftpcd(directory);

            sftprm(deleteFile);

        } catch (Exception e) {

            eprintStackTrace();

        }

    }

    

    public void disconnected(ChannelSftp sftp){

        if (sftp != null) {

            try {

                sftpgetSession()disconnect();

            } catch (JSchException e) {

                eprintStackTrace();

            }

            sftpdisconnect();

        }

    }

}

以上就是关于如何获取linux进程的执行文件路径全部的内容,包括:如何获取linux进程的执行文件路径、java向SFTP服务器上传文件,如何判断服务器上的文件夹是否存在、python打包exe后如何获取自身的执行路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9595074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存