账户切换[转自vbird]
我们都是使用一般账号登陆系统的,等有需要进行系统维护或软件升级时才转为 root 的身份来动作。 那如何让一般使用者转变身份成为 root 呢?主要有两种方式喔:
- 以『 su - 』直接将身份变成 root 即可,但是这个命令却需要 root 的口令,也就是说,如果你要以 su 变成 root 的话,你的一般使用者就必须要有 root 的口令才行;
- 以『 sudo 命令 』运行 root 的命令串,由于 sudo 需要事先配置妥当,且 sudo 需要输入用户自己的口令, 因此多人共管同一部主机时, sudo 要比 su 来的好喔!至少 root 口令不会流出去!
底下我们就来说一说 su 跟 sudo 的用法啦!
su
su 是最简单的身份切换命令了,他可以进行任何身份的切换唷!方法如下:
[root@www ~]# su [-lm] [-c 命令] [username]
选项与参数:
- :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统;
若使用者名称没有加上去,则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』
-c :仅进行一次命令,所以 -c 后面可以加上命令喔!
假设你原本是 vbird1 的身份,想要使用 non-login shell 的方式变成 root
[vbird1@www ~]$ su <==注意提示字符,是 vbird1 的身份喔!
Password: <==这里输入 root 的口令喔!
[root@www vbird1]# id <==提示字符的目录是 vbird1 喔!
uid=0(root) gid=0(root) groups=0(root),1(bin),... <==确实是 root 的身份!
[root@www vbird1]# env | grep 'vbird1'
USER=vbird1
PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin <==这个影响最大!
MAIL=/var/spool/mail/vbird1 <==收到的 mailbox 是 vbird1
PWD=/home/vbird1 <==并非 root 的家目录
LOGNAME=vbird1
# 虽然你的 UID 已经是具有 root 的身份,但是看到上面的输出信息吗?
# 还是有一堆变量为原本 vbird1 的身份,所以很多数据还是无法直接利用。
[root@www vbird1]# exit <==这样可以离开 su 的环境!
单纯使用『 su 』切换成为 root 的身份,读取的变量配置方式为 non-login shell 的方式,这种方式很多原本的变量不会被改变, 尤其是我们之前谈过很多次的 PATH 这个变量,由于没有改变成为 root 的环境 (一堆 /sbin, /usr/sbin 等目录都没有被包含进来), 因此很多 root 惯用的命令就只能使用绝对路径来运行咯。其他的还有 MAIL 这个变量,你输入 mail 时, 收到的邮件竟然还是 vbird1 的,而不是 root 本身的邮件!
使用 login shell 的方式切换为 root 的身份并观察变量
[vbird1@www ~]$ su -
Password: <==这里输入 root 的口令喔!
[root@www ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
# 了解差异了吧?下次变换成为 root 时,记得最好使用 su - 喔!
[root@www ~]# exit <==这样可以离开 su 的环境!
上述的作法是让使用者的身份变成 root 并开始操作系统,如果想要离开 root 的身份则得要利用 exit 离开才行。 那我如果只是想要运行『一个只有 root 才能进行的命令,且运行完毕
就恢复原本的身份』呢?那就可以加上 -c 这个选项啰
vbird1 想要运行『 head -n 3 /etc/shadow 』一次,且已知 root 口令
[vbird1@www ~]$ head -n 3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
[vbird1@www ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==这里输入 root 的口令喔!
root:$1$/30QpEWEBEZXRD0bh6rAABCEQD.BAH0:14126:0:99999:7:::
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
[vbird1@www ~]$ <==注意看,身份还是 vbird1 喔!继续使用旧的身份进行系统操作!
由于 /etc/shadow 权限的关系,该文件仅有 root 可以查阅。为了查阅该文件,所以我们必须要使用 root 的身份工作。 但我只想要进行一次该命令而已,此时就使用类似上面的语法吧!好,那接下来,如果我是 root 或者是其他人, 想要变更成为某些特殊账号,可以使用如下的方法来切换喔!
原本是 vbird1 这个使用者,想要变换身份成为 dmtsai 时
[vbird1@www ~]$ su -l dmtsai
Password: <==这里输入 dmtsai 的口令喔!
[dmtsai@www ~]$ su -
Password: <==这里输入 root 的口令喔!
[root@www ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd) ... <==确实有存在此人
[root@www ~]# su -l sshd
This account is currently not available. <==竟然说此人无法切换?
[root@www ~]# finger sshd
Login: sshd Name: Privilege-separated SSH
Directory: /var/empty/sshd Shell: /sbin/nologin
[root@www ~]# exit <==离开第二次的 su
[dmtsai@www ~]$ exit <==离开第一次的 su
[vbird1@www ~]$ exit <==这才是最初的环境!
su 就这样简单的介绍完毕,总结一下他的用法是这样的:
- 若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;
- 如果仅想要运行一次 root 的命令,可以利用『 su - -c "命令串" 』的方式来处理;
- 使用 root 切换成为任何使用者时,并不需要输入新用户的口令;
虽然使用 su 很方便啦,不过缺点是,当我的主机是多人共管的环境时,如果大家都要使用 su 来切换成为 root 的身份,那么不就每个人都得要知道 root 的口令,这样口令太多人知道可能会流出去, 很不妥当呢!怎办?透过 sudo 来处理即可!
sudo
相对于 su 需要了解新切换的用户口令 (常常是需要 root 的口令), sudo 的运行则仅需要自己的口令即可! 甚至可以配置不需要口令即可运行 sudo 呢!由于 sudo 可以让你以其他用户的身份运行命令 (通常是使用 root 的身份来运行命令),因此并非所有人都能够运行 sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够运行 sudo 这个命令喔!说的这么神奇,底下就来瞧瞧那 sudo 如何使用?
[root@www ~]# sudo -u sshd touch /tmp/mysshd
[root@www ~]# ll /tmp/mysshd
-rw-r--r-- 1 sshd sshd 0 Feb 28 17:42 /tmp/mysshd
# 特别留意,这个文件的权限是由 sshd 所创建的情况喔!
你想要以 vbird1 的身份创建 ~vbird1/www 并于其中创建 index.html 文件
[root@www ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \
> echo 'This is index.html file' > index.html"
[root@www ~]# ll -a ~vbird1/www
drwxr-xr-x 2 vbird1 vbird1 4096 Feb 28 17:51 .
drwx------ 5 vbird1 vbird1 4096 Feb 28 17:51 ..
-rw-r--r-- 1 vbird1 vbird1 24 Feb 28 17:51 index.html
# 要注意,创建者的身份是 vbird1 ,且我们使用 sh -c "一串命令" 来运行的!
sudo 可以让你切换身份来进行某项任务,例如上面的两个范例。范例一中,我们的 root 使用 sshd 的权限去进行某项任务! 要注意,因为我们无法使用『 su - sshd 』去切换系统账号 (因为系统账号的 shell 是 /sbin/nologin), 这个时候 sudo 真是他 X 的好用了!立刻以 sshd 的权限在 /tmp 底下创建文件!查阅一下文件权限你就了解意义啦! 至于范例二则更使用多重命令串 (透过分号 ; 来延续命令进行),使用 sh -c 的方法来运行一连串的命令, 如此真是好方便!
但是 sudo 默认仅有 root 能使用啊!为什么呢?因为 sudo 的运行是这样的流程:
- 当用户运行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有运行 sudo 的权限;
- 若使用者具有可运行 sudo 的权限后,便让使用者『输入用户自己的口令』来确认;
- 若口令输入成功,便开始进行 sudo 后续接的命令(但 root 运行 sudo 时,不需要输入口令);
- 若欲切换的身份与运行者身份相同,那也不需要输入口令。
所以说,sudo 运行的重点是:『能否使用 sudo 必须要看 /etc/sudoers 的配置值, 而可使用 sudo 者是透过输入用户自己的口令来运行后续的命令串』喔!由于能否使用与 /etc/sudoers 有关, 所以我们当然要去编辑 sudoers 文件啦!不过,因为该文件的内容是有一定的规范的,因此直接使用 vi 去编辑是不好的。 此时,我们得要透过 visudo 去修改这个文件喔!
visudo 与 /etc/sudoers
从上面的说明我们可以知道,除了 root 之外的其他账号,若想要使用 sudo 运行属于 root 的权限命令,则 root 需要先使用 visudo 去修改 /etc/sudoers ,让该账号能够使用全部或部分的 root 命令功能。为什么要使用 visudo 呢?这是因为 /etc/sudoers 是有配置语法的,如果配置错误那会造成无法使用 sudo 命令的不良后果。因此才会使用 visudo 去修改, 并在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法就是了。
一般来说,visudo 的配置方式有几种简单的方法喔,底下我们以几个简单的例子来分别说明:
- 单一用户可进行 root 所有命令,与 sudoers 文件语法:
假如我们要让 vbird1 这个账号可以使用 root 的任何命令,那么可以简单的这样进行修改即可:
[root@www ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL <==找到这一行,大约在 76 行左右
vbird1 ALL=(ALL) ALL <==这一行是你要新增的!
....(前面省略).... - 有趣吧!其实 visudo 只是利用 vi 将 /etc/sudoers 文件呼叫出来进行修改而已,所以这个文件就是 /etc/sudoers 啦! 这个文件的配置其实很简单,如上面所示,如果你找到 76 行 (有 root 配置的那行) 左右,看到的数据就是:
使用者账号 登陆者的来源主机名=(可切换的身份) 可下达的命令
root ALL=(ALL) ALL <==这是默认值- 上面这一行的四个组件意义是:
- 系统的哪个账号可以使用 sudo 这个命令的意思,默认为 root 这个账号;
- 当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的, 这个配置值可以指定客户端计算机(信任用户的意思)。默认值 root 可来自任何一部网络主机
- 这个账号可以切换成什么身份来下达后续的命令,默认 root 可以切换成任何人;
- 可用该身份下达什么命令?这个命令请务必使用绝对路径撰写。 默认 root 可以切换任何身份且进行任何命令之意。
那个 ALL 是特殊的关键词,代表任何身份、主机或命令的意思。所以,我想让 vbird1 可以进行任何身份的任何命令, 就如同上表特殊字体写的那样,其实就是复制上述默认值那一行,再将 root 改成 vbird1 即可啊! 此时『vbird1 不论来自哪部主机登陆,他可以变换身份成为任何人,且可以进行系统上面的任何命令』之意。 修改完请储存后离开 vi,并以 vbird1 登陆系统后,进行如下的测试看看:
[vbird1@www ~]$ tail -n 1 /etc/shadow <==注意!身份是 vbird1
tail: cannot open `/etc/shadow' for reading: Permission denied
# 因为不是 root 嘛!所以当然不能查询 /etc/shadow [vbird1@www ~]$ sudo tail -n 1 /etc/shadow <==透过 sudo We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things: #1) Respect the privacy of others. <==这里仅是一些说明与警示项目
#2) Think before you type.
#3) With great power comes great responsibility. Password: <==注意啊!这里输入的是『 vbird1 自己的口令 』
pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7:::
# 看!vbird1 竟然可以查询 shadow !- 注意到了吧!vbird1 输入自己的口令就能够运行 root 的命令!所以,系统管理员当然要了解 vbird1 这个用户的『操守』才行!否则随便配置一个用户,他恶搞系统怎办?另外,一个一个配置太麻烦了, 能不能使用群组的方式来配置呢?参考底下的方式吧。
- 利用群组以及免口令的功能处理 visudo
我们在本章前面曾经创建过 pro1, pro2, pro3 ,这三个用户能否透过群组的功能让这三个人可以管理系统? 可以的,而且很简单!同样我们使用实际案例来说明:
[root@www ~]# visudo <==同样的,请使用 root 先配置
....(前面省略)....
%wheel ALL=(ALL) ALL <==大约在 84 行左右,请将这行的 # 拿掉!
# 在最左边加上 % ,代表后面接的是一个『群组』之意!改完请储存后离开 [root@www ~]# usermod -a -G wheel pro1 <==将 pro1 加入 wheel 的支持- 上面的配置值会造成『任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何命令』的意思。 你当然可以将 wheel 换成你自己想要的群组名。接下来,请分别切换身份成为 pro1 及 pro2 试看看 sudo 的运行。
[pro1@www ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro1
....(前面省略)....
Password: <==输入 pro1 的口令喔!
pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7::: [pro2@www ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro2
Password:
pro2 is not in the sudoers file. This incident will be reported.
# 仔细看错误信息他是说这个 pro2 不在 /etc/sudoers 的配置中!- 这样理解群组了吧?如果你想要让 pro3 也支持这个 sudo 的话,不需要重新使用 visudo ,只要利用 usermod 去修改 pro3 的群组支持,让 wheel 也支持 pro3 的话,那他就能够进行 sudo 啰! 简单吧!不过,既然我们都信任这些 sudo 的用户了,能否提供『不需要口令即可使用 sudo 』呢? 就透过如下的方式:
[root@www ~]# visudo <==同样的,请使用 root 先配置
....(前面省略)....
%wheel ALL=(ALL) NOPASSWD: ALL <==大约在 87 行左右,请将 # 拿掉!
# 在最左边加上 % ,代表后面接的是一个『群组』之意!改完请储存后离开- 重点是那个 NOPASSWD 啦!该关键词是免除口令输入的意思喔!
- 有限制的命令操作:
上面两点都会让使用者能够利用 root 的身份进行任何事情!这样总是不太好~如果我想要让用户仅能够进行部分系统任务, 比方说,系统上面的 myuser1 仅能够帮 root 修改其他用户的口令时,亦即『当使用者仅能使用 passwd 这个命令帮忙 root 修改其他用户的口令』时,你该如何撰写呢?可以这样做:
[root@www ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) /usr/bin/passwd <==最后命令务必用绝对路径- 上面的配置值指的是『myuser1 可以切换成为 root 使用 passwd 这个命令』的意思。其中要注意的是: 命令字段必须要填写绝对路径才行!否则 visudo 会出现语法错误的状况发生! 此外,上面的配置是有问题的!我们使用底下的命令操作来让您了解:
[myuser1@www ~]$ sudo passwd myuser3 <==注意,身份是 myuser1
Password: <==输入 myuser1 的口令
Changing password for user myuser3. <==底下改的是 myuser3 的口令喔!这样是正确的
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully. [myuser1@www ~]$ sudo passwd
Changing password for user root. <==见鬼!怎么会去改 root 的口令?- 恐怖啊!我们竟然让 root 的口令被 myuser3 给改变了!下次 root 回来竟无法登陆系统...欲哭无泪~怎办? 所以我们必须要限制用户的命令参数!修改的方法为将上述的那行改一改先:
[root@www ~]# visudo <==注意是 root 身份
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
!/usr/bin/passwd root- 由于屏幕一行写不完,我将这行写成两行,所以上面第一行最后加上反斜杠啰。加上惊叹号『 ! 』代表『不可运行』的意思。 因此上面这一行会变成:可以运行『 passwd 任意字符』,但是『 passwd 』与『 passwd root 』这两个命令例外! 如此一来 myuser1 就无法改变 root 的口令了!这样这位使用者可以具有 root 的能力帮助你修改其他用户的口令, 而且也不能随意改变 root 的口令!很有用处的!
- 透过别名建置 visudo:
如上述第三点,如果我有 15 个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的配置写入 15 行啊? 而且如果想要修改命令或者是新增命令时,那我每行都需要重新配置,很麻烦ㄟ!有没有更简单的方式? 是有的!透过别名即可!我们 visudo 的别名可以是『命令别名、帐户别名、主机别名』等。不过这里我们仅介绍帐户别名, 其他的配置值有兴趣的话,可以自行玩玩!
假设我的 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的口令管理员的 sudo 列表中, 那我可以创立一个帐户别名称为 ADMPW 的名称,然后将这个名称处理一下即可。处理的方式如下:
[root@www ~]# visudo <==注意是 root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
!/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM- 我透过 User_Alias 创建出一个新账号,这个账号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!这个 ADMPW 代表后面接的那些实际账号。 而该账号能够进行的命令就如同 ADMPWCOM 后面所指定的那样!上表最后一行则写入这两个别名 (账号与命令别名), 未来要修改时,我只要修改 User_Alias 以及 Cmnd_Alias 这两行即可!配置方面会比较简单有弹性喔!
- sudo 的时间间隔问题:
或许您已经发现了,那就是,如果我使用同一个账号在短时间内重复操作 sudo 来运行命令的话, 在第二次运行 sudo 时,并不需要输入自己的口令!sudo 还是会正确的运行喔!为什么呢? 第一次运行 sudo 需要输入口令,是担心由于用户暂时离开座位,但有人跑来你的座位使用你的账号操作系统之故。 所以需要你输入一次口令重新确认一次身份。
两次运行 sudo 的间隔在五分钟内,那么再次运行 sudo 时就不需要再次输入口令了, 这是因为系统相信你在五分钟内不会离开你的作业,所以运行 sudo 的是同一个人!呼呼!真是很人性化的设计啊~ ^_^。不过如果两次 sudo 操作的间隔超过 5 分钟,那就得要重新输入一次你的口令了 (注4)
另外要注意的是,因为使用一般账号时,理论上不会使用到 /sbin, /usr/sbin 等目录内的命令,所以 $PATH 变量不会含有这些目录,因此很多管理命令需要使用绝对路径来下达比较妥当喔!
- sudo 搭配 su 的使用方式:
很多时候我们需要大量运行很多 root 的工作,所以一直使用 sudo 觉得很烦ㄟ!那有没有办法使用 sudo 搭配 su , 一口气将身份转为 root ,而且还用用户自己的口令来变成 root 呢?是有的!而且方法简单的会让你想笑! 我们创建一个 ADMINS 帐户别名,然后这样做:
[root@www ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -- 接下来,上述的 pro1, pro2, pro3, myuser1 这四个人,只要输入『 sudo su - 』并且输入『自己的口令』后, 立刻变成 root 的身份!不但 root 口令不会外流,用户的管理也变的非常方便! 这也是实务上面多人共管一部主机时常常使用的技巧呢!这样管理确实方便,不过还是要强调一下大前提, 那就是『这些你加入的使用者,全部都是你能够信任的用户』
转自 http://vbird.dic.ksu.edu.tw/linux_basic/0410accountmanager_4.php
账户切换[转自vbird]的更多相关文章
- linux下用户账户切换
1,)当前我已经登录一个用户hadoop,我怎么切换到root账户呢(应为一般用户经常会遇到无权限修改/etc/hosts./ect/hostname等文件的权限)? 使用命令sudo su root ...
- Linux - 账户切换授权
sudo 切换账户 echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备 visudo # sudo命令权限添加 /e ...
- linux账户管理[转自vbird]
useraddpasswdchageusermoduserdelfingerchfnchshidgroupaddgroupmodgroupdelgpasswd useradd 完全参考默认值创建一个用 ...
- Windows10微软在线账户与本地账户的切换方法
Win10里面存在着两个账户,除了本地账户外,还有着一个微软在线账户,这个账户可以同步设置.日历等数据.不过对于大部分用户来说,本地账户已经足够我们使用了,那么这两个账户之间该如何切换呢? Win10 ...
- Linux字符界面下用户账户的设置
在Linux系统字符界面下创建.修改以及删除用户账户主要使用useradd,usermod和userdel这3个命令. 一.创建用户账户 创建用户账户就是在系统中创建一个新账户,然后为新账户分配用户U ...
- 文件的搜寻【转vbird】
which (寻找『运行档』) [root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 分 ...
- QC在win7下不能访问QC服务器介绍
本地访问不了服务器QC的主要几个原因总结 服务器serverjbossextensionhpcmd 2016-03-24 兼容性问题: 1.在服务端QC的安装目录下jboss\server\def ...
- 鸟哥的linux私房菜学习笔记 __ 命令与文件的搜寻
连续输入两次[tab]按键就能够知道使用者有多少命令可以下达.那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧! 范例一: ...
- selenium启动Chrome时,加载用户配置文件
selenium启动Chrome时,加载用户配置文件 Selenium操作浏览器是不加载任何配置的,网上找了半天,关于Firefox加载配置的多点,Chrome资料很少,下面是关于加载Chrome ...
随机推荐
- 模拟iOS系统原生导航条隐藏或显示动画
借UIView动画,使更改导航条的hidden属性这一过程动起来.悦德财富:https://yuedecaifu.com 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- java基础-002
1.Java虚拟机和“平台无关语言” Java虚拟机是可以执行字节码的虚拟机进程.Java源文件被编译成被Java虚拟机执行的字节码文件. Java被设计成允许应用程序运行在任意的平台,而不需要程序员 ...
- poj2392 多重背包
//Accepted 868 KB 188 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...
- 需求分析(NABC)
团队开发需求分析 队长:郭庆樑 成员:林彦汝.张金 经过讨论,我们决定做一个基于Windows的小游戏——躲避小球. 把这个项目实现,组长强调有两点: 1.可实现:2.有用户. 可以说,我们最大的特点 ...
- R函数是对A方法的封装
$user = new UserController; === $user=A("User"); $user = new UserController; $user-& ...
- python 优雅的使用正则表达式 ~ 1
正则表达式简介 正则表达式 , 也称谓 REs , 本质上是一个微小且高度专业化的编程语言. 他被嵌入到许多语言当中 , 例如 python 就是通过 re 模块来提供给我们使用 , 正则表达式 是通 ...
- apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName的解决
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ...
- D - Mysterious Present
这个题和求最长递增序列的题类似,为了能输出一组可行的数据,我还用了一点儿链表的知识. Description Peter decided to wish happy birthday to his f ...
- 【LeetCode】Best Time to Buy and Sell Stock IV
Best Time to Buy and Sell Stock IV Say you have an array for which the ith element is the price of a ...
- MongoDB索引、聚合
用$where可以执行任意的js作为查询的一部分. db.foo.find({"$where" : function(){ for(var current in ...