mxxhcm's blog

  • 首页

  • 标签

  • 分类

  • 归档

tensorflow basic operation

发表于 2019-05-08 | 更新于 2019-05-16 | 分类于 tensorflow

创建Session

1
2
3
4
import tensorflow as tf
import matplotlib.pyplot as plt
n = 32
x = tf.linspace(-3.0, 3.0, n)

普通Session

1
sess = tf.Session()

交互式Session

1
2
import tensorflow as tf
sess = tf.InteractiveSession()

在sess内执行op

方法1

sess.run(tf.global_variables_initializer())
sess.run(op)
代码示例

1
2
sess.run(tf.global_variables_initializer())
result = sess.run(x)

方法2

tf.global_variables_initializer().run()
sess.run(op)
op.eval()
代码示例

1
2
3
tf.global_variables_initializer().run()
x.eval(session=sess)
sess.close()

新op添加到默认图上

1
2
3
4
5
6
7
8
9
10
11
12
import tensorflow as tf
sigma = 1.0
mean = 0.0
# 和x的shape是一样的
z = (tf.exp(tf.negative(tf.pow(x - mean, 2.0) /
(2.0 * tf.pow(sigma, 2.0)))) *
(1.0 / (sigma * tf.sqrt(2.0 * 3.1415))))
print(type(z))
print(z.graph is tf.get_default_graph())

plt.plot(z.eval())
plt.show()

查看shape

1
2
3
4
5
import tensorflow as tf
print(z.shape)
print(z.get_shape())
print(z.get_shape().as_list())
print(tf.shape(z).eval())

常用function

tf.stack

1
2
3
4
5
import tensorflow as tf
print(tf.stack([tf.shape(z),tf.shape(z),[3]]).eval())
# tf.reshape, tf.matmul
z_ = tf.matmul(tf.reshape(z, (n, 1)), tf.reshape(z, (1, n)))
plt.imshow(z_.eval()) plt.show()

tf.ones_like, tf.multiply

tf.ones_like返回与输入tensor具有相同shape的tensor

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf
x = tf.reshape(tf.sin(tf.linspace(- 3.0, 3.0, n)), (n, 1))
print(x.shape)
y = tf.reshape(tf.ones_like(x), (1, n))
print(y.shape)
print(y.eval())
z = tf.multiply(tf.matmul(x,y), z_)
print(z.shape)
plt.imshow(z.eval())
plt.show()

列出graph中所有操作

1
2
3
import tensorflow as tf
ops = tf.get_default_graph().get_operations()
print([op for op in ops])

代码

完整地址

参考文献

tensorflow boolean_mask

发表于 2019-05-08 | 更新于 2019-05-12 | 分类于 tensorflow

tf.boolean_mask

简单解释

用一个mask数组和输入的tensor做与操作,忽略为0的值。

api

定义在tensorflow/python/ops/array_ops.py

1
2
3
4
5
6
tf.boolean_mask(
tensor, # 要处理的tensor
mask, # 掩码,也需要是一个tensor
name='boolean_mask', # 这个op的名字
axis=None #
)

代码示例

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import tensorflow as tf

sess = tf.Session()
a = tf.Variable([1, 2, 3])
b = tf.Variable([2, 1.0, 4.0])
c = tf.Variable([2, 1.0, 0.0])
d = tf.Variable([2, 0.0, 4.0])
e = tf.Variable([0, 1.0, 4.0])
f = tf.Variable([0, 1.0, 0.0])
g = tf.Variable([0, 0.0, 0.0])

sess.run(tf.global_variables_initializer())
print("a: ", sess.run(a))
print("b: ", sess.run(b))
print("c: ", sess.run(c))
print("d: ", sess.run(d))
print("e: ", sess.run(e))
print("f: ", sess.run(f))
print("g: ", sess.run(g))
# c = tf.maximum(a, b)
a1 = tf.boolean_mask(a, b)
a2 = tf.boolean_mask(a, c)
a3 = tf.boolean_mask(a, d)
a4 = tf.boolean_mask(a, e)
a5 = tf.boolean_mask(a, f)
a6 = tf.boolean_mask(a, g)

print("tf.boolean(a, b):\n ", sess.run(a1))
print("tf.boolean(a, c):\n ", sess.run(a2))
print("tf.boolean(a, d):\n ", sess.run(a3))
print("tf.boolean(a, e):\n ", sess.run(a4))
print("tf.boolean(a, f):\n ", sess.run(a5))
print("tf.boolean(a, g):\n ", sess.run(a6))

输出如下:

a: [1 2 3]
b: [2. 1. 4.]
c: [2. 1. 0.]
d: [2. 0. 4.]
e: [0. 1. 4.]
f: [0. 1. 0.]
g: [0. 0. 0.]
tf.boolean(a, b):
[1 2 3]
tf.boolean(a, c):
[1 2]
tf.boolean(a, d):
[1 3]
tf.boolean(a, e):
[2 3]
tf.boolean(a, f):
[2]
tf.boolean(a, g):
[]

参考文献

1.http://landcareweb.com/questions/27920/zai-tensorflowzhong-ru-he-cong-pythonde-zhang-liang-zhong-huo-qu-fei-ling-zhi-ji-qi-suo-yin
2.https://www.tensorflow.org/api_docs/python/tf/boolean_mask

tensorflow summary

发表于 2019-05-08 | 更新于 2019-06-30 | 分类于 tensorflow

tf.summary

目的

该模块定义在tensorflow/_api/v1/summary/__init__.py文件中,主要用于可视化。
每次运行完一个op之后,调用writer.add_summary()将其写入事件file。因为summary操作实在数据流的外面进行操作的,并不会操作数据,所以需要每次运行完之后,都调用一次写入函数。

常用API

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1.定义一个summary scalar op,同时会将这个op加入到tf.GraphKeys.SUMMARIES collection中。
tf.summary.scalar(
name,
tensor, # 一个实数型的Tensor,包含单个的值。
collections=None, # 可选项,是graph collections keys的list,新的summary op会被添加到这个list of collection。默认的list是[GraphKeys.SUMMARIES]。
family=None
)
# 2.定义一个summary histogram op,同时会将这个op加入到tf.GraphKeys.SUMMARIES collection中。
tf.summary.histogram(
name,
values, # 一个实数型的Tensor,任意shape,用来生成直方图。
collections=None, # 可选项,是graph collections keys的list,新的summary op会被添加到这个list of collection。默认的list是[GraphKeys.SUMMARIES].
family=None
)
# 3.将所有定义的summary op集中到一块,如scalar,text,histogram等。
tf.summary.merge_all(
key=tf.GraphKeys.SUMMARIES, #指定用哪个GraphKey来collect summaries。默认设置为GraphKeys.SUMMARIES.并不是说将他们加入到哪个GraphKey的意思,tf.summary.scalar()等会将op加入到相应的colleection。
scope=None, #
name=None
)

scalar和histogram的区别

scalar记录的是一个标量。
而histogram记录的是一个分布,可以是任何shape。

函数示例

1
2
3
4
summary_loss = tf.summary.scalar('loss', loss)
summary_weights = tf.summary.scalar('weights', weights)
# merged可以代替sumary_loss和summary_weights op。
merged = tf.summary.merge_all()

关于tf.summary.histogram()的示例,可以点击查看。

类

1
2
3
4
5
6
7
8
9
10
# 定义将Summary数据写入event文件的类
tf.summary.FileWriter(
self,
logdir, 
graph=None,
max_queue=10,
flush_secs=120,
graph_def=None,
filename_suffix=None
)

类内函数

1
2
3
4
5
6
# 将summary op的输出存到event文件(Adds a Summary protocol buffer to the event file.)
tf.summary.FileWriter.add_summary(
self,
summary, # 一个Summary protocol buffer,一般是sess.run(summary_op)的结果
global_step=None
)

类示例

1
2
3
4
writer = tf.summary.FileWriter("./summary/")
with tf.Session() as sess:
summ = sess.run([merged], feed_dict={x: inputs, y: outputs})
writer.add_summary(summ, global_step=i)

使用流程

  1. summary_op = tf.summary_scalar() # 声明summary op,会将该op变量加入tf.GraphKeys.SUMMARIES collection
  2. merged = tf.summary.merge_all() # 将所有summary op合并
  3. writer = tf.summary.FileWriter() # 声明一个FileWrite文件,用于将Summary数据写入event文件
  4. output = sess.run([merged]) # 运行merge后的summary op
  5. writer.add_summary(output) # 将op运行后的结果写入事件文件

代码示例

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
graph = tf.Graph()

with graph.as_default():
# model parameters
w = tf.Variable([0.3], name="w", dtype=tf.float32)
b = tf.Variable([0.2], name="b", dtype=tf.float32)

x = tf.placeholder(tf.float32, name="inputs")
y = tf.placeholder(tf.float32, name="outputs")

with tf.name_scope('linear_model'):
linear = w * x + b

with tf.name_scope('cal_loss'):
loss = tf.reduce_mean(input_tensor=tf.square(y - linear), name='loss')

with tf.name_scope('add_summary'):
summary_loss = tf.summary.scalar('MSE', loss)
summary_b = tf.summary.scalar('b', b[0])

with tf.name_scope('train_model'):
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

inputs = [1, 2, 3, 4]
outputs = [2, 3, 4, 5]

with tf.Session(graph=graph) as sess:
writer = tf.summary.FileWriter("./summary/", graph)
merged = tf.summary.merge_all()

init_op = tf.global_variables_initializer()
sess.run(init_op)
for i in range(5000):
_, summ = sess.run([train, merged], feed_dict={x: inputs, y: outputs})
writer.add_summary(summ, global_step=i)

w_, b_, l_ = sess.run([w, b, loss], feed_dict={x: inputs, y: outputs})
print("w: ", w_, "b: ", b_, "loss: ", l_)
for var in tf.get_collection(tf.GraphKeys.SUMMARIES):
#for var in tf.get_collection(tf.GraphKeys.MODEL_VARIABLES):
print(var)

使用tensorboard --logdir ./summary/打开tensorboard
打开之后在每个图中会看到两个曲线,一个深色,一个浅色,浅色的是真实的值,深色的是在真实值的基础上进行了平滑。在左侧可以调整平滑系数,默认是0.6,如果是0表示不进行平滑,如果是1就成了一条直线。
如果多次运行的话,多次的结果都会在图中显示出来,鼠标移动到图中只能看到最新的那次结果。浅色的线是最新运行的结果的真实值,深色的线是平滑后的,设置为0可以看到深色和浅色重合了。横轴STEP表示按步长,RELATIVE表示按相对时间,WALL表示将它们分开显示。
对于histogram来说的话,这个它是把每一步中list的值做成了一个直方图,统计在每个范围内出现的值的个数,然后按照时间步展现出来每一步的直方图。但是这个直方图是做了一定优化的,如果拿几个值来测试,最后的结果跟你想的并不一定一样。
所以histogram就是展现出了每一步list的值主要集中在哪个地方。有两个mode,overlay和offset,overlay是重叠的。
overlay中横轴是bin的取值,纵轴是每个bin的频率,所有的时间步都在一起,每一条线都代表一个时间步的直方图,鼠标悬停上去会显示每一条线的时间步。
offset中横轴是bin的取值,纵轴是时间步,所有的直方图按照时间步进行展开,每一时间步都是一条单独的线,鼠标悬停上去会显示每一条线的频率。
。

官网示例

加了一定注释,可以点击查看

所有API

类

  • class Event: A ProtocolMessage
  • class FileWriter: Writes Summary protocol buffers to event files.
  • class FileWriterCache: Cache for file writers.
  • class SessionLog: A ProtocolMessage
  • class Summary: A ProtocolMessage
  • class SummaryDescription: A ProtocolMessage
  • class TaggedRunMetadata: A ProtocolMessage

函数

  • scalar(…): Outputs a Summary protocol buffer containing a single scalar value.
  • histogram(…): Outputs a Summary protocol buffer with a histogram.
  • image(…): Outputs a Summary protocol buffer with images.
  • tensor_summary(…): Outputs a Summary protocol buffer with a serialized tensor.proto.
  • audio(…): Outputs a Summary protocol buffer with audio.
  • text(…): Summarizes textual data.
  • merge(…): Merges summaries.
  • merge_all(…): Merges all summaries collected in the default graph.
  • get_summary_description(…): Given a TensorSummary node_def, retrieve its SummaryDescription.

参考文献

1.https://www.tensorflow.org/api_docs/python/tf/summary
2.https://www.tensorflow.org/api_docs/python/tf/summary/scalar
3.https://www.tensorflow.org/api_docs/python/tf/summary/histogram
4.https://www.tensorflow.org/api_docs/python/tf/summary/merge_all
5.https://www.tensorflow.org/guide/graphs#visualizing_your_graph
6.https://www.tensorflow.org/guide/summaries_and_tensorboard
7.https://www.tensorflow.org/tensorboard/r1/histograms
8.https://ask.csdn.net/questions/760881
9.https://gaussic.github.io/2017/08/16/tensorflow-tensorboard/

tensorflow math

发表于 2019-05-08 | 更新于 2019-05-10 | 分类于 tensorflow

tf.math

  • tf.add(x, y, name=None) # 求和
  • tf.sub(x, y, name=None) # 减法
  • tf.mul(x, y, name=None) # 乘法
  • tf.div(x, y, name=None) # 除法
  • tf.mod(x, y, name=None) # 取模
  • tf.maximumd(x, y, name=None) # x > y?x:y
  • tf.minimum(x, y, name=None) # x < y?x:y
  • tf.abs(x, name=None) # 求绝对值
  • tf.neg(x, name=None) # 取负
  • tf.sign(x, name=None) # 返回符号
  • tf.inv(x, name=None) # 取反
  • tf.square(x, name=None) # 平方
  • tf.round(x, name=None) # 四舍五入
  • tf.sqrt(x, name=None) # 开根号
  • tf.pow(x, name=None) #
  • tf.exp(x, name=None) #
  • tf.log(x, name=None) #
  • tf.sin(x, name=None) #
  • tf.cos(x, name=None) #
  • tf.tan(x, name=None) #
  • tf.atan(x, name=None) #

代码示例

tf.maximum

比较两个tensor,返回element-wise两个tensor的最大值。
代码地址示例:

1
2
3
4
5
6
7
8
9
10
11
12
import tensorflow as tf

sess = tf.Session()
a = tf.Variable([1, 2, 3])
b = tf.Variable([2, 1, 4])

sess.run(tf.global_variables_initializer())
print("a: ", sess.run(a))
print("b: ", sess.run(b))
c = tf.maximum(a, b)

print("tf.maximum(a, b):\n ", sess.run(c))

输出如下:

a: [1 2 3]
b: [2 1 4]
tf.maximum(a, b):
[2 2 4]

参考文献

tensorflow multinomial

发表于 2019-05-08 | 更新于 2019-05-12 | 分类于 tensorflow

tf.multinomial[1] (tf.random.categorical[2])

多项分布,采样。

更新

在tensorflow 13.1版本中,提示这个API在未来会被弃用,需要使用tf.random.categorical替代。

API

1
2
3
4
5
6
7
tf.multinomial(
logits, # 指定样本概率的tf.Tensor
num_samples, # 样本个数
seed=None, #, 0-D
name=None,
output_dtype=None
)

代码示例

代码地址

1
2
3
4
5
6
7
8
import tensorflow as tf

# tf.multinomial(logits, num_samples, seed=None, name=None)
# logits 是一个二维张量,指定概率,num_samples是采样个数
sess = tf.Session()
sample = tf.multinomial([[5.0, 5.0, 5.0], [5.0, 4, 3]], 10) # 注意logits必须是float
for _ in range(5):
print(sess.run(sample))

输出结果如下:

[[2 1 2 1 0 2 1 1 1 0]
[1 0 0 1 0 1 0 1 0 0]]
[[2 2 0 2 2 0 2 0 1 2]
[1 0 0 2 0 1 0 1 1 0]]
[[0 0 0 2 0 0 1 2 0 1]
[0 0 0 1 0 1 0 0 0 0]]
[[2 1 0 1 1 1 0 0 2 0]
[1 0 0 2 0 0 0 0 0 1]]
[[1 0 1 0 0 1 2 2 0 0]
[1 0 0 0 0 1 1 1 2 0]]

参考文献

1.https://www.tensorflow.org/api_docs/python/tf/random/multinomial
2.https://www.tensorflow.org/api_docs/python/tf/random/categorical

tensorflow app

发表于 2019-05-08 | 分类于 tensorflow

tf.app.flags

代码示例

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
flags.py
import tensorflow as tf

flags = tf.app.flags
flags.DEFINE_string('model', 'mxx', 'Type of model')
flags.DEFINE_boolean('gpu','True', 'use gpu?')
FLAGS = flags.FLAGS

def main(_):
for k,v in FLAGS.flag_values_dict().items():
print(k, v)

if __name__ == "__main__":
tf.app.run(main)

传递参数的方法有两种,一种是命令行~$:python flags.py --model hhhh ,一种是pycharm中传递参数。

tensorflow where

发表于 2019-05-08 | 分类于 tensorflow

tf.where

简单解释

tf.where(conditon) 返回条件为True的下标。
tf.where(condition, x=X, y=Y) 条件为True的对应位置值替换为1,为False替换成0。

API

定义在tensorflow/python/ops/array_ops.py中。

1
2
3
4
5
6
tf.where(
condition, # 条件
x=None, # 操作数1
y=None, # 操作数2
name=None
)

tf.where(condition)代码示例

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
import tensorflow as tf


X = tf.placeholder(tf.int32, [None, 7])

zeros = tf.zeros_like(X)
index = tf.not_equal(X, zeros)
loc = tf.where(index)

with tf.Session() as sess:
inputs = np.array([[1, 0, 3, 5, 0, 8, 6], [2, 3, 4, 5, 6, 7, 8]])
out = sess.run(loc, feed_dict={X: inputs})
print(np.array(out))
# 输出12个坐标,表示这个数组中不为0元素的索引。

tf.where(condition, x=X, y=Y)代码示例

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import tensorflow as tf


inputs = np.array([[1, 0, 3, 5, 0, 8, 6], [2, 3, 4, 5, 6, 7, 8]])
X = tf.placeholder(tf.int32, [None, 7])
zeros = tf.zeros_like(X)
ones = tf.ones_like(X)
loc = tf.where(inputs, x=ones, y=zeros)

with tf.Session() as sess:
out = sess.run(loc, feed_dict={X: inputs})
print(np.array(out))

参考文献

1.https://www.tensorflow.org/api_docs/python/tf/where

ubuntu 18.04 alt tab快捷键

发表于 2019-05-07 | 更新于 2019-06-12 | 分类于 linux

问题描述

ubuntu 16.04中,可以使用alt+tab快捷键在相同的应用中进行切换,在18.04中alt+tab是在不同的应用中切换。事实上,可以使用alt+`在该应用内切换,但是我还是想用alt+tab。

设置方法

打开setting >> Devices >> Keyboard
找到Switch windows,设置快捷键为alt+tab即可。

参考文献

1.https://superuser.com/questions/394376/how-to-prevent-gnome-shells-alttab-from-grouping-windows-from-similar-apps

linux file perission

发表于 2019-05-07 | 更新于 2019-12-17 | 分类于 linux

创建文件和目录

创建文件

~$:touch file

创建目录mkdir

~$:mkdir -p /dir/my_dir
~$:mkdir -p /dir/{test,test1,test2}

递归创建

~$:sudo mkdir -p /test/test
选项-R 递归的将某目录下所有的文件以及目录全部修改
~$:sudo chown -R root:root test

输出文件

一次性输出

  • cat
    -n --打印行号(包含空白行)
    -b --打印行号(不含空白行)
    -a --将一些看不见的字符用特殊符号打出来 空格用"I" 回车用"$"
  • tac(反向列出) cat --> tac
  • nl(添加行号打印)

分屏输出

  • more
  • less
  • head [-n number]
  • tail
  • od
    非纯文本文件(二进制文件)
    -t c ASCII
    a 默认字符
    o octal 八进制
    d decimal 十进制
    f 浮点数
    x 十六进制

输出文件类型

file 命令
查看文件类型,data或者ASCII或者binary
~$:file /usr/bin/passwd

rwx权限

r-读权限查询文件名数据

w-写权限

  • 新建文件与目录
  • 删除文件或者目录
  • 重命名以及转移文件或者目录

x-可执行权限

  • 进入某目录
  • 切换到该目录(cd命令)
    !!!能不能进入某一目录只与该目录的x权限有关,如果不拥有某目录的x权限,即使拥有r权限,那么也无法执行该目录下的任何命令
    但是即使拥有了x权限,但是没有r权限,能进入该目录但是不能打开该目录,因为没有读取的权限。
    cd - 回到上一次工作的目录

改变文件或者目录的权限

~$:sudo chmod 777 test
~$:sudo chmod +x test
~$:sudo chmod u=rwx,g=r,o=r test
r. u–user g–group o–others a–all

改变文件或者目录的属主

~$:sudo chown root:root test
~$:sudo chown root test

改变属组

~$:sudo chgrp root test

umask

用户创建文件时一般不应有执行的权限,所以创建文件的默认权限为666也即-rw-rw-rw-,但是目录需要有执行的权限,应为777,即-rwxrwxrwx,使用如下命令查看当前的umask:
~$:umask

0002

~$:umask -S

u=rwx,g=rwx,o=rx

第一个与特殊权限有关,后三个与一般权限有关,在创建文件或者目录时,会将umask所对应的权限拿掉,即新建文件时:
(-rw-rw-rw-)-(--------w-) = (-rw-rw-r–)所以创建文件的一般权限为-rw-rw-r –
同理可得创建目录时的权限应该为drwxrwxr-x即775。要修改umask的值,可直接在输入umask后接所要减去的权限
即
~$:umask 002
一般情况下root用户的umask为022,这是为了安全考虑,一般用户的umask是022,即保留了同用户组的写入权利。如果同一个用户组的不同用户无法修改另一个用户的文件,那么就可能是同组成员的创建文件时的默认权限不同,可以用umask修改。

修改文件时间

stat filename

列出该文件的各种时间

touch

-a 仅修改访问时间
-t 后面接欲修改的时间而不用当前时间,格式为[YYMMNNhhmm]
-d 接欲修改的日趋而不用当前日期,也可以用–date=“时间或者日 期”
-c 仅修改文件的时间(文件状态改变的时间)
-m 仅修改mtime(文件内容被更改的时间)
-d和-t修改的是mtime和atime 但是不能修改 ctime
~$:touch -d “2 days ago” testtouch
~$:touch -t 150929 testtouch

ls -l 默认显示的是mtime,是内容修改的时间(modify)
touch --time=ctime  ctime 显示的是状态被改变的时间,指的是文件属性和权限发生改变。
touch --time=atime atime 访问时间显示的是最近文件被访问的时间(acess),cat and more可以,但是像ls和stat不会改变

ls -lc # chagne state
ls -lu # acess time访问时间
ls -l # modify time

chattr与lsattr 设置文件的隐藏属性。

change attributes
chattr -i 设置文件不可以被删除(包括root用户)
-a 设置文件只能增加数据,而不能删除或者修改文件(如登陆文件)

chattr +i +a 可以增加文件的隐藏属性,其他属性不变
-i -a 可以除去文件的隐藏属性,其他属性不变
=i a 仅有=后面的属性

lsattr 查看文件的隐藏属性

文件特殊权限

在文件或者目录中除了rwx外,还会出现s,t,S,T权限

SUID

当s出现在文件所有者的x权限上时,

如
~$:ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root …
~$:ls -l /etc/shadow
-rw-r----- 1 root shadow

用户密码存在/etc/shadow内,当用户想要修改密码时,可以使用passwd进行修改
用户mxx对于/etc/shadow没有任何权限,但是对于/usr/bin/passwd拥有r-x权限, 所以可以执行passwd命令,由于在passwd命令中有SUID权限,所以mxx在执行pass- wd命令时,会暂时获得passwd拥有者即root的权限,所以接下来可以用passwd修改 /etc/shadow。

!!!此权限仅可用于二进制程序中,且仅在执行该程序的过程中有效,此外只对 于文件有效,对于目录也是无效的

SGID

当s权限出现在用户组的x权限时,如
~$:ls -l /usr/bin/mlocate /var/lib/mlocate/mlocate.db

-rwx–s--x 1 root mlocate

同SUID类似,程序执行者会获得该程序用户组的支持,还可以用在目录上,若该用户在此目录下具有w权限,用户创建的新文件的用户组与此目录组的用户组相同
~$:su root
~$:mkdir test
~$:ls -l test

drwxrwxr-x 2 root root …

~$:chmod 2777 test
~$:ls -l test

drwxrwsrwx 2 root root

~$:su mxx
~$:cd test
~$:touch test

-rw-rw-r-- 1 mxx root …

!!!此权限对于目录以及文件都有效

SBIT

当t出现在others的x权限上时
~$:ls -l /tmp

drwxrwxrwt 13 root root …

用户对于某个目录具有wx的权限,即可以写入的权限,相当于说目录的属主给了用 户属组或者其他人的身份,并拥有w的权限,那么也就是说这个用户具有删除属主
创建的文件或者目录的删除等权限。但是如果该目录拥有了SBIT的权限,那么该用 户就只能删除自己所创建的文件,而不能删除属主所创建的文件。
!!!此权限只针对目录有效

如何设置文件以及目录的特殊权限(SUID 4,SGID 2 ,SBIT 1)

最前面的一位为文件的特殊权限
直接用chmod 4755 filename就可以了
还可以通过加法来实现,如SUID为u+s,SGID为g+s,SBIT为o+t
此外还有大写的S和T,代表空,如
~$:chmod 7666 test
~$:ls -l test

-rwSrwSrwT 1 mxx mxx

因为s和t都是替代x的,而当文件所有者以及其他用户用户组都没有x的时候,所以 就不用说其他的操作了,所以也就为空了

常见配置文件

  • /bin:可以被单用户执行的命令。其下的命令可以被root用户和普通用户执行,如cat,cd,cp,date,chown,chmod,等等
  • /sbin/:开机过程所需要的,只能被root用户所执行,普通用户只能进行查询,包括与开机,还原系统所需要的命令
  • /usr/bin:绝大部分的用户可使用命令都在这里
  • /usr/sbin/:服务器所需要的某些软件程序
  • /usr/local/sbin:本机自行安装的软件产生的系统执行文件
  • / 根目录
  • /etc 系统的配置文件
  • /lib 执行文件所需要的函数库与内核所需要的模块
  • /bin 重要执行文件
  • /sbin 重要的系统执行文件
  • /dev 所需要的设备文件

这五个目录必须和根目录放在一块。

根目录最好小一些,将一些经常用到的文件目录(/home:/usr:/var:/tmp与根目录分到不同的分区。因为越大的分区,放入的数据也就越多,出错的几率也就越大,而如果根目录出现问题,系统就可能会出现问题。

参考文献

1.《鸟哥的LINUX私房菜》

linux search file command

发表于 2019-05-07 | 更新于 2019-06-16 | 分类于 linux

命令与文件的查询

文件查询

  • find
  • whereis
  • locate

whereis和locate利用数据库查找,find查找硬盘。

命令查询

  • which

find

find从硬盘中查找文件,还可以查找具有特殊要求的文件,如查找文件所有者,文件大小,SUID等等

与时间有关的参数

~$:find /tmp mtime n/+n/-n

与用户或者用户组有关的文件

find / -uid n
-gid n
-user name
-group name
-nouser
-nogroup

与文件权限或者名称有关的参数

find / -name filename
-size [±]SIZE
-type TYPE[-fbcdls]
-perm mode 刚好等于mode
-perm -mode 全部包含
-perm /mode 任意一个

find示例

1
2
3
4
5
6
# 查找/home/maddpg目录下所有__pycache__目录和文件
find /home/maddpg -name **__pycache__
# 查看根目录下所有权限为7000的文件
find / -perm +7000 -exec ls -l {} \;
# 查找当前目录下size在1k到5k之间的文件,+表示大于,-表示小于
find . -size -5k -a -size +1k # 是会把当前目录也列出来的

whereis

参数介绍

whereis [-bmsu]
-b 二进制文件
-m manualz路径下的文件(说明文件)
-s source源文件
-u 不在上述范围的其他特殊文件

locate

locate 查找/var/lic/mlocate数据库内的数据,该数据库每天更新一次可手动更新,updatedb,因为他是每天更新一次,所以可能会找到已删除的文件或者是找不到新建立的文件。

which

参数介绍

which -a command 列出所有的位置。
which command 列出第一个找到的位置

示例

~$:which -a python

/home/mxxmhh/anaconda3/bin/python
/usr/bin/python

~$:which pip

/home/mxxmhh/anaconda3/bin/pip

参考文献

1.《鸟哥的LINUX私房菜》
2.http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html

1…242526…34
马晓鑫爱马荟荟

马晓鑫爱马荟荟

记录硕士三年自己的积累

337 日志
26 分类
77 标签
RSS
GitHub E-Mail
© 2022 马晓鑫爱马荟荟
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Pisces v6.6.0