diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-06-14 13:37:20 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-06-14 12:18:48 +0000 |
commit | acfe45c4348e9db30c3db682cf0863f38a5094cb (patch) | |
tree | 341b0b808e3f69c44e2a9834d1044593fa5f6f7a | |
parent | cd8ebb21e3445dd1b02f3401cd3c223e14c45c26 (diff) |
SSH: Fix running remote process in terminal
ConsoleProcess stumbles over the special characters in the remote
command and as a result silently runs the command locally instead.
Prevent that. We can (and should) simply leave these characters alone,
as they have no special meaning on the local machine.
Change-Id: I31b3afe1cf170e51d431372b15f4df3656006959
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/libs/utils/consoleprocess.h | 4 | ||||
-rw-r--r-- | src/libs/utils/consoleprocess_unix.cpp | 5 | ||||
-rw-r--r-- | src/libs/utils/consoleprocess_win.cpp | 4 | ||||
-rw-r--r-- | src/libs/utils/qtcprocess.cpp | 4 | ||||
-rw-r--r-- | src/libs/utils/qtcprocess.h | 3 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp | 3 |
6 files changed, 15 insertions, 8 deletions
diff --git a/src/libs/utils/consoleprocess.h b/src/libs/utils/consoleprocess.h index 28be67f0bf..82d0a5d8bb 100644 --- a/src/libs/utils/consoleprocess.h +++ b/src/libs/utils/consoleprocess.h @@ -70,7 +70,9 @@ public: QProcess::ProcessError error() const; QString errorString() const; - bool start(const QString &program, const QString &args); + enum class MetaCharMode { Abort, Ignore }; + bool start(const QString &program, const QString &args, + MetaCharMode metaCharMode = MetaCharMode::Ignore); public slots: void stop(); diff --git a/src/libs/utils/consoleprocess_unix.cpp b/src/libs/utils/consoleprocess_unix.cpp index 53a8c95848..43afffa0a2 100644 --- a/src/libs/utils/consoleprocess_unix.cpp +++ b/src/libs/utils/consoleprocess_unix.cpp @@ -65,7 +65,7 @@ void ConsoleProcess::setSettings(QSettings *settings) d->m_settings = settings; } -bool ConsoleProcess::start(const QString &program, const QString &args) +bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode) { if (isRunning()) return false; @@ -75,7 +75,8 @@ bool ConsoleProcess::start(const QString &program, const QString &args) QtcProcess::SplitError perr; QtcProcess::Arguments pargs = QtcProcess::prepareArgs(args, &perr, HostOsInfo::hostOs(), - &d->m_environment, &d->m_workingDir); + &d->m_environment, &d->m_workingDir, + metaCharMode == MetaCharMode::Abort); QString pcmd; if (perr == QtcProcess::SplitOk) { pcmd = program; diff --git a/src/libs/utils/consoleprocess_win.cpp b/src/libs/utils/consoleprocess_win.cpp index 2a68ddaba8..be65c42cc8 100644 --- a/src/libs/utils/consoleprocess_win.cpp +++ b/src/libs/utils/consoleprocess_win.cpp @@ -51,8 +51,10 @@ qint64 ConsoleProcess::applicationMainThreadID() const return d->m_appMainThreadId; } -bool ConsoleProcess::start(const QString &program, const QString &args) +bool ConsoleProcess::start(const QString &program, const QString &args, MetaCharMode metaCharMode) { + Q_UNUSED(metaCharMode); + if (isRunning()) return false; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index d05746d5b1..992e1817c0 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -595,12 +595,12 @@ static QString quoteArgWin(const QString &arg) } QtcProcess::Arguments QtcProcess::prepareArgs(const QString &cmd, SplitError *err, OsType osType, - const Environment *env, const QString *pwd) + const Environment *env, const QString *pwd, bool abortOnMeta) { if (osType == OsTypeWindows) return prepareArgsWin(cmd, err, env, pwd); else - return Arguments::createUnixArgs(splitArgs(cmd, osType, true, err, env, pwd)); + return Arguments::createUnixArgs(splitArgs(cmd, osType, abortOnMeta, err, env, pwd)); } diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index d3d22d3415..5eeacf666e 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -79,7 +79,8 @@ public: //! Prepare argument of a shell command for feeding into QProcess static Arguments prepareArgs(const QString &cmd, SplitError *err, OsType osType = HostOsInfo::hostOs(), - const Environment *env = nullptr, const QString *pwd = nullptr); + const Environment *env = nullptr, const QString *pwd = nullptr, + bool abortOnMeta = true); //! Prepare a shell command for feeding into QProcess static bool prepareCommand(const QString &command, const QString &arguments, QString *outCmd, Arguments *outArgs, OsType osType = HostOsInfo::hostOs(), diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp index 030e4057a3..7e8be72c65 100644 --- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp +++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp @@ -201,7 +201,8 @@ void SshDeviceProcess::handleConnected() this, &SshDeviceProcess::handleProcessStarted); connect(&d->consoleProcess, &ConsoleProcess::stubStopped, this, [this] { handleProcessFinished(d->consoleProcess.errorString()); }); - d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' ')); + d->consoleProcess.start(cmdLine.first(), cmdLine.mid(1).join(' '), + ConsoleProcess::MetaCharMode::Ignore); } else { connect(d->process.get(), &QSsh::SshRemoteProcess::started, this, &SshDeviceProcess::handleProcessStarted); |