【问题标题】:How to escape an @ sign in the password field of an smb:// URL如何在 smb:// URL 的密码字段中转义 @ 符号
【发布时间】:2011-04-06 13:54:32
【问题描述】:

我正在尝试编写一个连接到 samba 服务器的 bash 脚本,方法是获取用户名和密码,然后输入 $username:$password@SERVERNAME。

但是,如果密码中包含@,这将失败。有没有办法在bash中将@从密码中转义?

提前致谢

更新: 我正在设置这台网络打印机

lpadmin -p PRINTER -v smb://$username:$password@SERVER -E

它可以工作,除非 $password 中有一个 @ 符号; $username 和 $passwords 变量是通过读取标准输入获得的

【问题讨论】:

  • 只是双引号变量
  • 我认为问题不在于 bash,而在于让 Samba 识别密码中的哪个“@”以及哪个“@”标记密码的结尾。我怀疑是否有办法做到这一点,但如果有,您将需要查看 Samba 手册以获取信息。 “医生,医生,我这样打自己很痛”?或者,换句话说,不要在密码中使用“@”,因为它会导致悲伤。
  • 也许尝试用%40 替换所有@...我认为它不会起作用,但也许就是这样。使用$password=${password//@/%40} 替换它们。
  • 是的,dreamlax 是个好主意,但是我的 samba 服务器不接受 %40。

标签: bash samba escaping


【解决方案1】:

啊,不,这实际上不是引用 Bash 的问题,而是引用 Samba 的问题。你有这个:

lpadmin -p PRINTER -v smb://$username:$password@SERVER -E

Bash 忠实地扩展到了哪个

lpadmin -p PRINTER -v smb://alice:passw@rd@SERVER -E

然后 Samba 客户端库 认为密码在第一个 @ 符号处结束,它应该连接到名为 rd@server 的服务器,别介意你实际上不能把那个名字放进去DNS。

lpadmin 来自 CUPS,而不是来自 Samba (here is its manpage),稍微阅读一下这些文档,我认为您可以使用这种替代语法:

lpadmin -p PRINTER -U "${username}%${password}" -v smb://SERVER -E

我很惊讶将@ 转义为%40 不起作用,不过。在我看来,这就像 samba 客户端库中的错误。

【讨论】:

  • 你是对的,它是samba;我已更新问题以反映您的要求。
  • 谢谢!更新了我的答案,实际上可能会为您解决问题。
【解决方案2】:

我使用http://localhost:631/ 的 cups 管理员添加打印机。将 @ 编码为 %40 对我有用。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2016-03-10
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多