命令行安全技巧

dea*_*mer 34 unix command-line-interface

命令行和脚本是危险的。使用 rm -rf 犯一个小错误,你就会陷入伤害的世界。在运行导入脚本时将数据库名称中的 prod 与 stage 混淆,并且您已绑定(如果它们在同一台服务器上,这并不好,但会发生)。同样为太晚注意到您 sshed 所在的服务器名称不是您在玩弄一些命令后认为的那样。你必须尊重Hole Hawg

在运行有风险的命令之前,我有一些小习惯——比如对我所在的服务器进行三重检查。这是一篇关于 rm security有趣文章

什么小仪式、工具和技巧可以让你在命令行上保持安全?我的意思是客观的东西,比如“首先运行 ls foo*,查看它的输出,然后用 rm -rf 替换 ls 以避免运行 rm -rf foo * 或类似的东西”,而不是“确保你知道什么是命令会做”。

and*_*hky 45

一种有效的方法是在您的 shell 上为 prod/staging/test 服务器使用不同的背景颜色。

  • 是的,只要您有 root 权限,也可以使用明亮的尖叫红色或橙色。 (6认同)
  • 只需有一个 switch 语句,根据机器的主机名更改您的 PS1 变量。 (2认同)
  • 对于任何 Windows 用户,Sysinternals 的这个 gem 将在墙纸上突出显示主机信息。http://technet.microsoft.com/en-us/sysinternals/bb897557.aspx?wt.svl=related (2认同)

Pet*_*ter 14

在开始之前,请记住一个退出计划。

  • 压缩文件/目录而不是立即删除它
  • 将(cisco)路由器设置为在“x”分钟后重新启动,不要立即“wr”
  • 确保您正在更改的界面不是您进入系统的界面。这可能是您通过 telnet 连接到的路由器接口或 VNC 连接到的以太网端口。
  • 永远不要以“root”身份登录
  • 做一个备份。检查它是否良好。再做一个。
  • 问问你信任的人“我会在这里做一些愚蠢的事情吗?”

  • +1 cisco ios 在确定它可以工作之前不会保存。该死的,我记得所有操作系统对话框都有“使用”、“保存”和“取消”的 Amiga 时代 - 其中“使用”只会应用设置但不会保存它们以备下次重启。那非常有用! (3认同)

Ave*_*yne 10

我对其中一些问题有一个低技术的解决方案。

我已经养成了执行以下操作的先天习惯(计划以 root 身份工作时):

  • 首先以普通用户登录,然后使用sudo su - root切换到root。我这样做是作为一种心理准备,提醒我我已经在心理上走进了一个非常危险的区域,我应该时刻保持警惕和警惕。听起来很有趣,仅凭这个小小的仪式就让我免于悲伤,因为它只是强调了我不能粗心大意
  • 每个命令都被输入,但从按下[Return] 键。 从来没有
  • 没有命令永远不理解执行的正是它做什么。 如果您在不知道它的作用的情况下执行此操作,那么您就是在用您的系统玩俄罗斯轮盘赌
  • 按下 [Return] 键之前,会仔细检查在 CLI 上敲出的命令。如果有任何犹豫,任何潜在问题的暗示,都会再次重新检查。如果这种犹豫仍然存在,命令会保留在行上,然后我按 alt-F2 到另一个控制台以查阅手册页等。如果在图形会话中,我会启动浏览器并进行一些搜索。
  • 从来没有普通用户使用过sudo我的系统,不是因为我是 BOFH,而是因为没有准备和培训,这就像给一只猴子上膛的枪。一开始很有趣,直到猴子低头看着桶并挤压......

使用rm的时候,我总是cd先到目录,然后用前缀of./来保证目录正确,即

cd /usr/some/directory ; rm ./targetfile

或者我指定文件的整个路径

rm /usr/some/directory/targetfile

这是一个 PITA 但......总比抱歉更安全。

  • 引用:“但是因为没有准备和训练,这就像给一只猴子上膛的枪。起初很有趣很有趣,直到猴子低头看枪管并挤压......”实际上,在那之后仍然很有趣。 .. 有点乱 (2认同)

Bri*_*ter 10

这是特定于 Windows Powershell 的。

作为一项策略,我们在每台服务器上添加以下机器 profile.ps1。这可确保以下情况为真:

  1. 管理 powershell 控制台窗口具有深红色背景色
  2. 标题中添加了管理员
  3. 消息“警告:Powershell 正在以管理员身份运行。” 是在启动时写的
  4. 标题栏以“管理员:”为前缀
  5. 标准实用程序(如公司 shell 脚本、vim 和 infozip)位于路径中。
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal( [Security.Principal.WindowsIdentity]::GetCurrent() )
&{
    if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        (get-host).UI.RawUI.Backgroundcolor="DarkRed"
        清除主机
        写主机“警告:PowerShell 以管理员身份运行。`n”
    }

    $utilities = $null
    if( [IntPtr]::size * 8 -eq 64 )
    {
        $host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)" 
        $utilities = "${env:programfiles(x86)}\Utilities"
    }
    别的
    {
        $host.UI.RawUI.WindowTitle = "Windows PowerShell (x86)"
        $utilities = "${env:programfiles}\Utilities"
    }
    if( (Test-Path $utilities) -and !($env:path -match $utilities.Replace("\","\\")) )
    {
        $env:path = "$utilities;${env:path}"
    }
}

功能提示
{
    if ($currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        if(!$host.UI.RawUI.WindowTitle.StartsWith("管理员:"))
        { $Host.UI.RawUI.WindowTitle = "管理员:" + $host.UI.RawUI.WindowTitle }
    }
    'PS' + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '
}

  • 将 $ConfirmPreference 更改为“中”(默认为高)也很有用,更多的东西会提示确认。 (2认同)

ojb*_*ass 6

我同意上述所有答案,但我必须强调这个非常非常重要的提示:

知道何时避免多任务处理。


l0c*_*b0x 5

在更改服务器之前,有几件重要的事情需要注意:

  • 确保我在正确的服务器上

  • 请注意**有多少人会受到此操作的影响*(如果您犯了错误)

  • 在输入“回车”键之前,请注意撤销可能性

  • 问问自己这个命令是否有可能断开会话(fw 规则、错误关机等)。确保你有一个故障转移回来(特别是如果你不在现场)


Tim*_*Tim 5

我确保我所在系统的主机名在 bash(或其他 shell)提示中。如果我被 chroot 了,我会确保它也以某种方式进入那里。

我曾经在另一个实时 Linux 发行版中安装 Gentoo 系统,并且不小心rm在错误的 shell 中运行了一个相当具有破坏性的命令(不记得它是 ATM - 的某个变体),导致实时系统上的一堆东西删除,而不是 chroot 中的内容。从那以后,我一直这样做

export PS1="(chroot) $PS1"
Run Code Online (Sandbox Code Playgroud)

每当我在 chroot 中工作时。