跳到主要内容

os

os 库提供操作系统交互能力,覆盖环境变量、进程信息、主机/网络信息、本地端口探测与文件系统基础操作,是采集本机环境与做系统级判断的入口。

典型使用场景:

  • 主机与网络信息:os.Hostname / os.GetMachineID / os.GetHomeDiros.GetLocalIPv4Address / os.GetLocalAddress / os.LookupIP / os.LookupHost 获取地址与解析。
  • 端口探测:os.GetRandomAvailableTCPPort 取空闲端口,os.IsTCPPortOpen / os.IsRemoteTCPPortOpen / os.IsTCPPortAvailable 判断端口状态,os.WaitConnect 等待可连接。
  • 进程与环境:os.Getpid / os.Getppid / os.Getuidos.Getenv / os.Setenv / os.Environ / os.ExpandEnv 管理环境变量。
  • 文件与监控:os.Remove / os.RemoveAll / os.Rename / os.TempDiros.NewProcessWatcher / os.NewConnectionsWatcher 监控进程/连接。

与相邻库的关系:osenv(环境变量)、exec(执行命令)、file(文件操作)、hids(主机监控)协同,是系统层信息采集的基础。

共 43 个函数、7 个实例

实例

实例名类型说明
ARCHstring"amd64"
Args[]stringCommand line arguments
IsPrivilegedboolfalse
OSstring"linux"
Stderros.File&os.File{file: &os.file{pfd: poll.FD{fdmu: poll.fdMutex{state: 0, rsema: 0, wsema: 0}, Sysfd: 2, SysFile: poll.SysFile{iovecs: (*[]syscall.Iovec)(nil)}, pd: poll.pollDesc{runtimeCtx: 0}, csema: 0, isBlocking: 1, IsStream: true, ZeroReadIsEOF: true, isFile: true}, name: "/dev/stderr", dirinfo: atomic.Pointer[os.dirInfo]{_: [0]*os.dirInfo{}, _: atomic.noCopy{}, v: (unsafe.Pointer)(nil)}, nonblock: false, stdoutOrErr: true, appendMode: false}}
Stdinos.File&os.File{file: &os.file{pfd: poll.FD{fdmu: poll.fdMutex{state: 0, rsema: 0, wsema: 0}, Sysfd: 0, SysFile: poll.SysFile{iovecs: (*[]syscall.Iovec)(nil)}, pd: poll.pollDesc{runtimeCtx: 0}, csema: 0, isBlocking: 1, IsStream: true, ZeroReadIsEOF: true, isFile: true}, name: "/dev/stdin", dirinfo: atomic.Pointer[os.dirInfo]{_: [0]*os.dirInfo{}, _: atomic.noCopy{}, v: (unsafe.Pointer)(nil)}, nonblock: false, stdoutOrErr: false, appendMode: false}}
Stdoutos.File&os.File{file: &os.file{pfd: poll.FD{fdmu: poll.fdMutex{state: 0, rsema: 0, wsema: 0}, Sysfd: 1, SysFile: poll.SysFile{iovecs: (*[]syscall.Iovec)(nil)}, pd: poll.pollDesc{runtimeCtx: 0}, csema: 0, isBlocking: 1, IsStream: true, ZeroReadIsEOF: true, isFile: true}, name: "/dev/stdout", dirinfo: atomic.Pointer[os.dirInfo]{_: [0]*os.dirInfo{}, _: atomic.noCopy{}, v: (unsafe.Pointer)(nil)}, nonblock: false, stdoutOrErr: true, appendMode: false}}

函数索引

函数参数返回值说明
os.Chdirdir stringerror改变当前工作目录
os.Chmodname string, mode os.FileModeerror改变指定文件或目录的权限
os.Chownname string, uid int, gid interror改变指定文件或目录的所有者和所属组
os.Clearenv--清空当前进程的所有环境变量
os.Environ-[]string获取表示环境变量的字符串切片,格式为"key=value"
os.Executable-string, error获取当前可执行文件的路径
os.Exitcode int-以指定状态码退出当前进程
os.ExpandEnvs stringstring将字符串中的 ${var} 或 $var 替换为其对应环境变量的值
os.GetDefaultDNSServers-[]string获取默认的DNS服务器ip对应的字符串切片
os.GetHomeDir-string获取当前用户的家目录
os.GetLocalAddress-[]string获取本地IP地址
os.GetLocalIPv4Address-[]string获取本地IPv4地址
os.GetLocalIPv6Address-[]string获取本地IPv6地址
os.GetMachineID-string获取每个机器唯一的标识符
os.GetRandomAvailableTCPPort-int获取一个随机可用的TCP端口
os.GetRandomAvailableUDPPort-int获取一个随机可用的UDP端口
os.Getegid-int获取当前进程的有效组ID
os.Getenvkey stringstring获取指定的环境变量的值,如果不存在则返回空字符串
os.Geteuid-int获取当前进程的有效用户ID
os.Getgid-int获取当前进程的组ID
os.Getpid-int获取当前进程的进程ID
os.Getppid-int获取当前进程的父进程ID
os.Getuid-int获取当前进程的用户ID
os.Getwd-string, error获取当前工作目录路径
os.Hostname-string, error获取主机名
os.IsRemoteTCPPortOpenhost string, p intbool检查远程主机的TCP端口是否开放
os.IsTCPPortAvailablep intbool检查本地TCP端口是否可用(未被占用)
os.IsTCPPortOpenp intbool检查本地TCP端口是否开放(被占用)
os.IsUDPPortAvailablep intbool检查本地UDP端口是否可用(未被占用)
os.IsUDPPortOpenp intbool检查本地UDP端口是否开放(被占用)
os.LookupEnvkey stringstring, bool获取指定的环境变量的值,并返回该变量是否存在
os.LookupHosti string[]string通过DNS服务器,根据域名查找IP
os.LookupIPi string[]string通过DNS服务器,根据域名查找IP
os.NewConnectionsWatcherpid int32, cb NewRemoteIPCallback, interval time.Duration*ConnectionsWatcher, error针对单个进程创建一个网络连接监控器,发现新的远程 IP 时回调通知
os.NewProcessWatcher-*ProcessesWatcher创建并初始化一个新的系统进程监控器,用于监控进程的创建与退出
os.Pipe-*os.File, *os.File, error创建一个管道,返回一个读取端和一个写入端以及错误
os.Removename stringerror删除指定的文件或空目录
os.RemoveAllname stringerror递归删除指定的路径及其包含的所有子路径
os.Renameoldpath string, newpath stringerror重命名文件或目录,可以用于移动文件或目录
os.Setenvkey string, value stringerror设置指定的环境变量
os.TempDir-string获取用于存放临时文件的默认目录路径
os.Unsetenvkey stringerror删除指定的环境变量
os.WaitConnectaddr string, timeout float64error等待一个地址的端口开放,直到超时,如果超时则返回错误,这通常用于等待并确保一个服务启动

函数详情

Chdir

Chdir(dir string) error

改变当前工作目录

参数

参数名类型说明
dirstring目标工作目录路径

返回值

序号类型说明
r1error错误信息

示例

err = os.Chdir("/tmp")

Chmod

Chmod(name string, mode os.FileMode) error

改变指定文件或目录的权限

参数

参数名类型说明
namestring文件或目录路径
modeos.FileMode目标权限(如 0o777)

返回值

序号类型说明
r1error错误信息

示例

err = os.Chmod("/tmp/test.txt", 0777)

Chown

Chown(name string, uid int, gid int) error

改变指定文件或目录的所有者和所属组

参数

参数名类型说明
namestring文件或目录路径
uidint新的所有者用户 ID
gidint新的所属组 ID

返回值

序号类型说明
r1error错误信息

示例

err = os.Chown("/var/www/html/test.txt", 1000, 1000)

Clearenv

Clearenv()

清空当前进程的所有环境变量

示例

os.Clearenv()

Environ

Environ() []string

获取表示环境变量的字符串切片,格式为"key=value"

返回值

序号类型说明
r1[]string形如 "key=value" 的环境变量字符串切片

示例

for env in os.Environ() {
value = env.SplitN("=", 2)
printf("key = %s, value = %v\n", value[0], value[1])
}

Executable

Executable() (string, error)

获取当前可执行文件的路径

返回值

序号类型说明
r1string当前可执行文件的绝对路径
r2error错误信息

示例

path, err = os.Executable()

Exit

Exit(code int)

以指定状态码退出当前进程

参数

参数名类型说明
codeint进程退出状态码(0 表示成功)

示例

os.Exit(0)

ExpandEnv

ExpandEnv(s string) string

将字符串中的 ${var} 或 $var 替换为其对应环境变量的值

参数

参数名类型说明
sstring含有环境变量引用的字符串

返回值

序号类型说明
r1string替换后的字符串

示例

os.Setenv("YAK_DOC_EXPAND", "yak")
result = os.ExpandEnv("hello $YAK_DOC_EXPAND")
println(result) // OUT: hello yak
assert result == "hello yak", "ExpandEnv should substitute the variable value"

GetDefaultDNSServers

GetDefaultDNSServers() []string

获取默认的DNS服务器ip对应的字符串切片

返回值

序号类型说明
r1[]string默认 DNS 服务器 IP 字符串切片

示例

os.GetDefaultDNSServers()

GetHomeDir

GetHomeDir() string

获取当前用户的家目录

返回值

序号类型说明
r1string当前用户的家目录路径

示例

os.GetHomeDir() // "/Users/yaklang"

GetLocalAddress

GetLocalAddress() []string

获取本地IP地址

返回值

序号类型说明
r1[]string本地网卡 IP 地址字符串切片

示例

os.GetLocalAddress() // ["192.168.1.103", "fe80::605a:5ff:fefb:5405"]

GetLocalIPv4Address

GetLocalIPv4Address() []string

获取本地IPv4地址

返回值

序号类型说明
r1[]string本地非回环 IPv4 地址字符串切片

示例

os.GetLocalIPv4Address() // ["192.168.3.103"]

GetLocalIPv6Address

GetLocalIPv6Address() []string

获取本地IPv6地址

返回值

序号类型说明
r1[]string本地非回环 IPv6 地址字符串切片

示例

os.GetLocalIPv6Address() // ["fe80::605a:5ff:fefb:5405"]

GetMachineID

GetMachineID() string

获取每个机器唯一的标识符

返回值

序号类型说明
r1string当前机器的唯一标识字符串

示例

os.GetMachineID()

GetRandomAvailableTCPPort

GetRandomAvailableTCPPort() int

获取一个随机可用的TCP端口

返回值

序号类型说明
r1int一个当前可用的 TCP 端口号

示例

tcp.Serve("127.0.0.1", os.GetRandomAvailableTCPPort())

GetRandomAvailableUDPPort

GetRandomAvailableUDPPort() int

获取一个随机可用的UDP端口

返回值

序号类型说明
r1int一个当前可用的 UDP 端口号

示例

udp.Serve("127.0.0.1", os.GetRandomAvailableTCPPort())

Getegid

Getegid() int

获取当前进程的有效组ID

返回值

序号类型说明
r1int当前进程的有效组 ID

示例

os.Getegid()

Getenv

Getenv(key string) string

获取指定的环境变量的值,如果不存在则返回空字符串

参数

参数名类型说明
keystring环境变量名

返回值

序号类型说明
r1string环境变量的值,不存在时为空字符串

示例

os.Setenv("YAK_DOC_GET", "world")
value = os.Getenv("YAK_DOC_GET")
println(value) // OUT: world
assert value == "world", "Getenv should return the value set by Setenv"

Geteuid

Geteuid() int

获取当前进程的有效用户ID

返回值

序号类型说明
r1int当前进程的有效用户 ID

示例

os.Geteuid()

Getgid

Getgid() int

获取当前进程的组ID

返回值

序号类型说明
r1int当前进程的组 ID

示例

os.Getgid()

Getpid

Getpid() int

获取当前进程的进程ID

返回值

序号类型说明
r1int当前进程 ID

示例

os.Getpid()

Getppid

Getppid() int

获取当前进程的父进程ID

返回值

序号类型说明
r1int当前进程的父进程 ID

示例

os.Getppid()

Getuid

Getuid() int

获取当前进程的用户ID

返回值

序号类型说明
r1int当前进程的用户 ID

示例

os.Getuid()

Getwd

Getwd() (string, error)

获取当前工作目录路径

返回值

序号类型说明
r1string当前工作目录路径
r2error错误信息

示例

cwd, err = os.Getwd()

Hostname

Hostname() (name string, err error)

获取主机名

返回值

序号类型说明
namestring主机名
errerror错误信息

示例

name, err = os.Hostname()

IsRemoteTCPPortOpen

IsRemoteTCPPortOpen(host string, p int) bool

检查远程主机的TCP端口是否开放

参数

参数名类型说明
hoststring远程主机地址(域名或 IP)
pint待检查的 TCP 端口号

返回值

序号类型说明
r1bool远程端口是否开放

示例

os.IsRemoteTCPPortOpen("yaklang.com", 443) // true

IsTCPPortAvailable

IsTCPPortAvailable(p int) bool

检查本地TCP端口是否可用(未被占用)

参数

参数名类型说明
pint待检查的 TCP 端口号

返回值

序号类型说明
r1bool端口是否可用(可被监听)

示例

os.IsTCPPortAvailable(80)

IsTCPPortOpen

IsTCPPortOpen(p int) bool

检查本地TCP端口是否开放(被占用)

参数

参数名类型说明
pint待检查的 TCP 端口号

返回值

序号类型说明
r1bool端口是否开放(已被监听)

示例

os.IsTCPPortOpen(80)

IsUDPPortAvailable

IsUDPPortAvailable(p int) bool

检查本地UDP端口是否可用(未被占用)

参数

参数名类型说明
pint待检查的 UDP 端口号

返回值

序号类型说明
r1bool端口是否可用

示例

os.IsUDPPortAvailable(80)

IsUDPPortOpen

IsUDPPortOpen(p int) bool

检查本地UDP端口是否开放(被占用)

参数

参数名类型说明
pint待检查的 UDP 端口号

返回值

序号类型说明
r1bool端口是否开放(已被占用)

示例

os.IsUDPPortOpen(80)

LookupEnv

LookupEnv(key string) (string, bool)

获取指定的环境变量的值,并返回该变量是否存在

参数

参数名类型说明
keystring环境变量名

返回值

序号类型说明
r1string环境变量的值
r2bool该环境变量是否存在

示例

os.Setenv("YAK_DOC_LOOKUP", "hello")
value, ok = os.LookupEnv("YAK_DOC_LOOKUP")
println(value) // OUT: hello
assert ok, "LookupEnv should report the variable exists"
assert value == "hello", "LookupEnv should return the variable value"

LookupHost

LookupHost(i string) []string

通过DNS服务器,根据域名查找IP

参数

参数名类型说明
istring待查询的域名

返回值

序号类型说明
r1[]string解析得到的 IP 字符串切片

示例

os.LookupHost("www.yaklang.com")

LookupIP

LookupIP(i string) []string

通过DNS服务器,根据域名查找IP

参数

参数名类型说明
istring待查询的域名

返回值

序号类型说明
r1[]string解析得到的 IP 字符串切片

示例

os.LookupIP("www.yaklang.com")

NewConnectionsWatcher

NewConnectionsWatcher(pid int32, cb NewRemoteIPCallback, interval time.Duration) (*ConnectionsWatcher, error)

针对单个进程创建一个网络连接监控器,发现新的远程 IP 时回调通知

参数

参数名类型说明
pidint32待监控的进程 ID
cbNewRemoteIPCallback发现新远程 IP 时的回调函数,签名为 func(pid, remoteIP)
intervaltime.Duration轮询连接的时间间隔

返回值

序号类型说明
r1*ConnectionsWatcher连接监控器对象
r2error错误信息(进程不存在时非空)

示例

w = os.NewConnectionsWatcher(os.Getpid(), (pid, ip) => {
log.info("process %v connects to %v", pid, ip)
}, 1 * time.Second)~

NewProcessWatcher

NewProcessWatcher() *ProcessesWatcher

创建并初始化一个新的系统进程监控器,用于监控进程的创建与退出

返回值

序号类型说明
r1*ProcessesWatcher进程监控器对象

示例

w = os.NewProcessWatcher()
// 通过 w.Start(...) 启动监控

Pipe

Pipe() (r *os.File, w *os.File, err error)

创建一个管道,返回一个读取端和一个写入端以及错误

它实际是 io.Pipe 的别名

返回值

序号类型说明
r*os.File管道的读取端文件对象
w*os.File管道的写入端文件对象
errerror错误信息

示例

r, w, err = os.Pipe()
die(err)

go func {
w.WriteString("hello yak")
w.Close()
}

bytes, err = io.ReadAll(r)
die(err)
dump(bytes)

Remove

Remove(name string) error

删除指定的文件或空目录

参数

参数名类型说明
namestring待删除的文件或目录路径

返回值

序号类型说明
r1error错误信息

示例

os.Remove("/tmp/test.txt")

RemoveAll

RemoveAll(name string) error

递归删除指定的路径及其包含的所有子路径

参数

参数名类型说明
namestring待删除的路径

返回值

序号类型说明
r1error错误信息

示例

os.RemoveAll("/tmp")

Rename

Rename(oldpath string, newpath string) error

重命名文件或目录,可以用于移动文件或目录

参数

参数名类型说明
oldpathstring原路径
newpathstring目标路径

返回值

序号类型说明
r1error错误信息

示例

os.Rename("/tmp/test.txt", "/tmp/test2.txt")
os.Rename("/tmp/test", "/root/test")

Setenv

Setenv(key string, value string) error

设置指定的环境变量

参数

参数名类型说明
keystring环境变量名
valuestring环境变量值

返回值

序号类型说明
r1error错误信息

示例

os.Setenv("YAK_DOC_SET", "yaklang")
println(os.Getenv("YAK_DOC_SET")) // OUT: yaklang
assert os.Getenv("YAK_DOC_SET") == "yaklang", "Setenv then Getenv should round-trip"

TempDir

TempDir() string

获取用于存放临时文件的默认目录路径

返回值

序号类型说明
r1string系统临时目录路径

示例

dir = os.TempDir()
assert dir != "", "TempDir should return a non-empty path"
assert file.IsDir(dir), "TempDir should point to an existing directory"

Unsetenv

Unsetenv(key string) error

删除指定的环境变量

参数

参数名类型说明
keystring待删除的环境变量名

返回值

序号类型说明
r1error错误信息

示例

os.Setenv("YAK_DOC_UNSET", "v")
os.Unsetenv("YAK_DOC_UNSET")
assert os.Getenv("YAK_DOC_UNSET") == "", "Unsetenv should remove the environment variable"

WaitConnect

WaitConnect(addr string, timeout float64) error

等待一个地址的端口开放,直到超时,如果超时则返回错误,这通常用于等待并确保一个服务启动

参数

参数名类型说明
addrstring目标地址(host:port)
timeoutfloat64最长等待时间(秒)

返回值

序号类型说明
r1error错误信息(超时或连接失败时非空)

示例

timeout, _ = time.ParseDuration("1m")
ctx, cancel = context.WithTimeout(context.New(), timeout)

go func() {
err = tcp.Serve("127.0.0.1", 8888, tcp.serverCallback(func (conn) {
conn.Send("hello world")
conn.Close()
}), tcp.serverContext(ctx))

die(err)
}()

os.WaitConnect("127.0.0.1:8888", 5)~ // 等待tcp服务器启动
conn = tcp.Connect("127.0.0.1", 8888)~
bytes = conn.Recv()~
println(string(bytes))